Java Hibernate会话和实体管理器是否共享同一事务?
我们目前正在应用程序上使用Hibernate 3.6。应用程序充分利用了Hibernate会话,SpringHibernateTemplate——最近我们开始将代码迁移到更标准的实体管理器,但这是一个渐进的过程 所以我遇到了一个问题,我们在一个方法(服务方法是@Transactional)中同时使用hibernate会话和实体管理器,并且一个操作依赖于另一个,如下所示:Java Hibernate会话和实体管理器是否共享同一事务?,java,hibernate,session,transactions,Java,Hibernate,Session,Transactions,我们目前正在应用程序上使用Hibernate 3.6。应用程序充分利用了Hibernate会话,SpringHibernateTemplate——最近我们开始将代码迁移到更标准的实体管理器,但这是一个渐进的过程 所以我遇到了一个问题,我们在一个方法(服务方法是@Transactional)中同时使用hibernate会话和实体管理器,并且一个操作依赖于另一个,如下所示: hqlQuery = session.createQuery("DELETE FROM address WHERE user_
hqlQuery = session.createQuery("DELETE FROM address WHERE user_id = 1");
hqlQuery.executeUpdate();
jpaQuery = em.createQuery("DELETE FROM user WHERE id = 1");
jpaQuery.executeUpdate();
// this throws org.hibernate.exception.ConstraintViolationException - cannot delete user because there are still references to this user in address
我怀疑这可能是因为Hibernate对会话和EntityManager使用了不同的事务(在不同的连接中)——addreses的删除在一个事务中完成,用户的删除在第二个事务中完成——那么很清楚为什么用户的删除会因外键约束而失败
会话和EntityManager共享同一个事务管理器,但我不知道这是否重要
我想通过从session.getTransaction()和em.getTransaction()获取一些事务ID来测试这一点,但没有标识符
所以问题是-会话和EntityManager之间是否可以共享一个事务?如果是,怎么做
谢谢 您是否使用Hibernate作为JPA提供程序?是否所有实体都在Hibernate和JPA中映射?是的,Hibernate用作JPA提供程序。所有实体都在JPA和Hibernate中映射。本质上,我们使用JPA EntIdMeor来管理我们使用Hibernate EntEng/Session的确切内容。您可以考虑使用EntMyMealth.UnrWAP(session .class)来获得Hibernate会话,而不是同时拥有Hibernate SeStudio工厂和EntityManagerFactory: