0

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

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

4

1 回答 1

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 的方式/原因(如果这不是您所期望的)。

于 2012-06-20T16:30:34.973 回答