首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java JPA,使用实体管理器设置事务隔离级别

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

Stack Overflow用户
提问于 2016-05-24 02:35:39
回答 2查看 4.7K关注 0票数 1

我正在尝试为与给定实体管理器(TRANSACTION_SERIALIZABLE等)相关联的连接设置事务隔离级别。

我在互联网上寻找解决方案,找到了几个。然而,它们似乎都不起作用。

当我尝试执行以下操作时:

代码语言:javascript
复制
EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("BankingPU");
public EntityManager em = emfactory.createEntityManager();

java.sql.Connection connection = (java.sql.Connection) em.getDelegate();               
connection.setTransactionIsolation(TRANSACTION_SERIALIZABLE);

我得到了以下异常:

代码语言:javascript
复制
Exception in thread "main" java.lang.ClassCastException: 
org.eclipse.persistence.internal.jpa.EntityManagerImpl cannot be cast to java.sql.Connection

当我这样做的时候

代码语言:javascript
复制
EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("BankingPU");
public EntityManager em = emfactory.createEntityManager();

java.sql.Connection connection = em.unwrap(java.sql.Connection.class);

存储到connection的值是null

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

代码语言:javascript
复制
Object obj = em.getDelegate();

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

编辑:(哦,我想我可以从异常中看出来)

Edit2:

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

代码语言:javascript
复制
 Session session = ((EntityManagerImpl) em).getSession();

但是,其中既没有connection(),也没有DoWork()方法。

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

EN

回答 2

Stack Overflow用户

发布于 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,则可以在应用程序服务器中为具有所需隔离级别的同一数据库创建多个数据源。然而,您需要了解,您将拥有几个一级缓存(在不同的实体管理器中),并且您应该以适当的方式管理您的实体状态。

票数 2
EN

Stack Overflow用户

发布于 2016-05-24 03:00:09

我已经找到了解决方案:

代码语言:javascript
复制
    emfactory = Persistence.createEntityManagerFactory("BankingPU");
    em = emfactory.createEntityManager();

    Session session = ((EntityManagerImpl) em).getSession();
    DatabaseLogin databaseLogin = (DatabaseLogin) session.getDatasourceLogin();
    databaseLogin.setTransactionIsolation(DatabaseLogin.TRANSACTION_SERIALIZABLE);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37398148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档