Hibernate会话和实体管理器共享同一个事务吗?

时间:2014-02-06 16:43:12

标签: java hibernate session transactions

我们目前在我们的应用程序上使用Hibernate 3.6。应用程序充满了Hibernate Session,Spring HibernateTemplate的使用 - 最近我们开始将代码迁移到更标准的Entity Manager,但这是一个渐进的过程。

所以我遇到了一个问题,我们在一个方法中使用hibernate会话和实体管理器(服务方法是@Transactional),一个操作依赖于另一个,如下所示:

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使用不同的事务(在不同的连接中) - 删除addreses在一个事务中完成并且删除用户在第二个事务中完成 - 然后很明显为什么删除用户由于外键约束而失败。

Session和EntityManager共享同一个事务管理器,但我不知道这是否重要。

我想通过从session.getTransaction()和em.getTransaction()获取一些事务ID来测试它,但是没有标识符。

所以问题是 - 是否可以在Session和EntityManager之间共享一个事务?如果是,怎么样?

谢谢!

0 个答案:

没有答案