Java JPA,使用实体管理器

时间:2016-05-23 18:35:39

标签: 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);

我得到以下异常:

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()方法都不存在。

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

2 个答案:

答案 0 :(得分:0)

我找到了解决方案:

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

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

答案 1 :(得分:0)

JPA API没有事务(TX)隔离级别管理API。因此,不可能通过实体管理器执行此操作。 如果您想要使用与所需的实体管理器相同的对象(如Neil Stockton注释中所述),则可以使用JPA提供程序特定的代码来获得JDBC访问权限以更改TX隔离级别。 亚当·比恩(Adam Bien)的blog post几乎回答了您的问题。 隔离级别可以在java.sql.Connection级别上设置。在Java EE环境中,可以在数据源/连接池上配置隔离级别(例如,参见Glassfish)。

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