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

Java JPA,使用实体管理器设置事务隔离级别,java,jpa,transactions,Java,Jpa,Transactions,我正在尝试为与给定实体管理器关联的连接设置事务隔离级别(transaction\u SERIALIZABLE等) 我在互联网上搜寻了一个解决方案,找到了一些。然而,它们似乎都不起作用 当我尝试执行以下操作时: EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("BankingPU"); public EntityManager em = emfactory.createEntityManager();

我正在尝试为与给定实体管理器关联的连接设置事务隔离级别(
transaction\u 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

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

编辑2:

我(我想)通过拨打以下电话获得了会话:

 Session session = ((EntityManagerImpl) em).getSession();
但是,其中既没有
connection()
,也没有
DoWork()
方法


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

我找到了解决方案:

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

    Session session = ((EntityManagerImpl) em).getSession();
    DatabaseLogin databaseLogin = (DatabaseLogin) session.getDatasourceLogin();
    databaseLogin.setTransactionIsolation(DatabaseLogin.TRANSACTION_SERIALIZABLE);

JPA API没有事务(TX)隔离级别管理API。因此,不可能通过实体管理器来实现。 如果您想使用与您需要的相同的实体管理器,正如Neil Stockton评论中已经提到的那样,您可以使用JPA提供程序特定的代码来获取JDBC访问权,以更改TX隔离级别。 亚当·边几乎在他的演讲中回答了你的问题。 可以在java.sql.Connection级别上设置隔离级别。在JavaEE环境中,可以在数据源/连接池上配置隔离级别(参见Glassfish)

作为解决方法,如果您只想使用JPAAPI,您可以在应用服务器中为同一数据库创建多个具有所需隔离级别的数据源。
但是,您需要了解,您将拥有多个一级缓存(在不同的实体管理器中),并且您应该以适当的方式管理您的实体状态。

您要提到的是,您似乎正在使用HIBERNATE,因为您发布的内容对任何其他JPA实现都是完全无用的,所以这个“答案”不是JPA的答案,而是仅针对HIBERNATE的