Java JPA,使用实体管理器设置事务隔离级别

use*_*186 5 java jpa transactions

我正在尝试为与给定实体管理器(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);
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

Exception in thread "main" java.lang.ClassCastException: 
org.eclipse.persistence.internal.jpa.EntityManagerImpl cannot be cast to java.sql.Connection
Run Code Online (Sandbox Code Playgroud)

当我做

EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("BankingPU");
public EntityManager em = emfactory.createEntityManager();

java.sql.Connection connection = em.unwrap(java.sql.Connection.class);
Run Code Online (Sandbox Code Playgroud)

connection存储的值为null。

为了了解更多信息,我运行了以下命令:

Object obj = em.getDelegate();
Run Code Online (Sandbox Code Playgroud)

存储的类类型obj是org.eclipse.persistence.internal.jpa.EntityManagerImpl

编辑:(哎呀,我想我可以从例外中看出这一点)

编辑2:

我已经通过调用以下命令成功获得了会话(我认为):

 Session session = ((EntityManagerImpl) em).getSession();
Run Code Online (Sandbox Code Playgroud)

然而,其中既没有connection(),也DoWork()没有方法。

知道如何跟进并设置事务隔离级别吗?

use*_*186 1

我已经找到了解决方案:

    emfactory = Persistence.createEntityManagerFactory("BankingPU");
    em = emfactory.createEntityManager();

    Session session = ((EntityManagerImpl) em).getSession();
    DatabaseLogin databaseLogin = (DatabaseLogin) session.getDatasourceLogin();
    databaseLogin.setTransactionIsolation(DatabaseLogin.TRANSACTION_SERIALIZABLE);
Run Code Online (Sandbox Code Playgroud)

  • 你会提到你似乎正在使用 HIBERNATE,因为你发布的内容对于任何其他 JPA 实现都是完全无用的,所以这个“答案”不是 JPA 的答案,而是明确仅针对 HIBERNATE (3认同)