由于自动连接检查而跳过JTA同步注册

时间:2012-06-20 12:07:04

标签: hibernate persistence jta entitymanager

我正在尝试保留一个简单的实体,但它没有持久存储到数据库而没有任何错误。我正在使用glassfish 3.1.2,hibernate 4.1.3.Final,事务范围/容器管理实体管理器。 jta事务在persistence.xml中配置,并且正确设置了jta数据源。它是一个具有默认事务级别(REQUIRED)的无状态会话Bean。在控制台中,我看到Hibernate的TransactionCoordinatorImp多次发出“由于自动连接检查而跳过JTA同步注册”消息。我可以使用entitymanager.find找到手动插入的实体。但无法坚持或合并。什么可能是问题的任何想法?

更新:似乎该问题与“由于自动加入检查而跳过JTA同步注册”消息无关。如果我将事务隔离级别设置为REQUIRES_NEW,则添加新实体,但如果我将隔离级别设置为REQUIRED则不会持久化。此方法是第一个接收jax-rs Web服务调用的方法。为什么我需要REQUIRES_NEW隔离级别?

1 个答案:

答案 0 :(得分:2)

你没有提供足够的关于你的设置的细节,所以我只能回答一般。

跳过同步注册位实际上确实发挥了作用。这是JPA称之为事务加入的一部分。基本原则是不允许(按规范)自动参与创建时未激活的事务的EntityManager。在伪代码中,它的区别在于:

// start transaction
// create EntityManager
// use EntityManager
// commit transaction

// create EntityManager
// start transaction
// use EntityManager
// commit transaction

在第一种情况下,EntiytManager是在活动事务的范围内创建的,因此它会自动加入。在第二种情况下,它是在活动事务的范围之外创建的,因此它不能自动加入。

在这种情况下,必须调用EntityManager.joinTransaction()才能使EntityManager参与事务:

// create EntityManager
// start transaction
entityManager.joinTransaction();
// use EntityManager
// commit transaction

这是您自己所处的情况。您只需要了解如何在事务范围之外创建EntityManager,如果这不是您所期望的那样。