我们目前在应用程序中使用Hibernate 3.6。应用程序中充满了对Hibernate Session、Spring HibernateTemplate的使用 - 最近我们开始将代码迁移到更标准的Entity Manager,但这是一个逐步的过程。
所以我遇到了一个问题,我们在一个方法(@Transactional的服务方法)中同时使用Hibernate Session和Entity Manager,并且一个操作依赖于另一个操作,就像这样:
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在Session和EntityManager中使用不同的事务(在不同的连接中)-地址的删除或添加在一个事务中完成,而用户的删除在第二个事务中完成-那么很明显,由于外键约束,用户的删除失败了。
Session和EntityManager共享相同的事务管理器,但我不知道这是否重要。
我想通过从session.getTransaction()和em.getTransaction()获取一些事务ID来测试这一点,但没有标识符。
所以问题是 - 是否可以在Session和EntityManager之间共享一个事务?如果可以,如何实现?
谢谢!