2

我正在独立模式下试验JPA(由 Hibernate 支持)。我注意到以下代码成功地将数据库值更改为“乱码”:

A a = em.find(A.class, 1);
a.setA1("garbled");
entityTransaction.begin();   // line 3
entityTransaction.commit();  // line 4
em.close();                 

在第 3 行之前没有其他事务begin()EntityTransaction 的 API 规范中使用的语言似乎另有说明,或者在使用begin()commit()划分JPA实体事务的模型中可能有些违反直觉?请注意,第3行和第 4行是必需的,因为将它们注释掉不会更改数据库值。

4

1 回答 1

3

a在您的示例中,是与实例关联的托管实体em,可以在事务边界之外进行修改,并将作为从同一实体管理器实例提交事务的一部分持久化。事务边界仅定义提交事务时进入数据库的内容以及事务失败时恢复对数据库所做的更改。假设您在示例中的事务失败,a仍然会进行更改,只是数据库不会有这些更改,因此对其他人不可见。

如果您期望托管实体不应该在事务边界之外进行修改,或者在事务边界之外对它们的任何更改都不应该被持久化,那么这是不正确的。托管实体的生命周期与其实体管理器相关联。

于 2012-10-24T11:40:15.760 回答