我正在尝试为与给定实体管理器(TRANSACTION_SERIALIZABLE等)相关联的连接设置事务隔离级别。
我在互联网上寻找解决方案,找到了几个。然而,它们似乎都不起作用。
当我尝试执行以下操作时:
EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("BankingPU");
public EntityManager em = emfactory.createEntityManager();
java.sql.Connection connection = (java.sql.Connection) em.getDelegate();
connection.setTransactionIsolation(TRANSACTION_SERIALIZABLE);我得到了以下异常:
Exception in thread "main" java.lang.ClassCastException:
org.eclipse.persistence.internal.jpa.EntityManagerImpl cannot be cast to java.sql.Connection当我这样做的时候
EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("BankingPU");
public EntityManager em = emfactory.createEntityManager();
java.sql.Connection connection = em.unwrap(java.sql.Connection.class);存储到connection的值是null。
为了了解更多信息,我运行了以下命令:
Object obj = em.getDelegate();存储在obj中的类类型是org.eclipse.persistence.internal.jpa.EntityManagerImpl
编辑:(哦,我想我可以从异常中看出来)
Edit2:
我已经设法(我认为)通过调用以下命令获得了会话:
Session session = ((EntityManagerImpl) em).getSession();但是,其中既没有connection(),也没有DoWork()方法。
你知道如何跟进并设置事务隔离级别吗?
发布于 2018-09-02 19:14:38
JPA API没有事务(TX)隔离级别管理API。所以不可能通过实体管理器来实现。如果您希望使用与所需的实体管理器相同的实体管理器,正如Neil Stockton评论中已经提到的,您的JPA提供者特定的代码可以获得JDBC访问权限以更改TX隔离级别。Adam Bien在他的blog post上几乎回答了你的问题。可以在java.sql.Connection级别上设置隔离级别。在Java EE环境中,可以在数据源/连接池上配置隔离级别(例如,请参阅Glassfish)。
作为变通方法,如果您只想使用JPA API,则可以在应用程序服务器中为具有所需隔离级别的同一数据库创建多个数据源。然而,您需要了解,您将拥有几个一级缓存(在不同的实体管理器中),并且您应该以适当的方式管理您的实体状态。
发布于 2016-05-24 03:00:09
我已经找到了解决方案:
emfactory = Persistence.createEntityManagerFactory("BankingPU");
em = emfactory.createEntityManager();
Session session = ((EntityManagerImpl) em).getSession();
DatabaseLogin databaseLogin = (DatabaseLogin) session.getDatasourceLogin();
databaseLogin.setTransactionIsolation(DatabaseLogin.TRANSACTION_SERIALIZABLE);https://stackoverflow.com/questions/37398148
复制相似问题