我在独立模式下试验 JPA (由Hibernate支持)。 我注意到以下代码成功将数据库值更改为“乱码”:
A a = em.find(A.class, 1);
a.setA1("garbled");
entityTransaction.begin(); // line 3
entityTransaction.commit(); // line 4
em.close();
第3行之前没有其他交易 begin()。 API spec for EntityTransaction中使用的语言似乎表明不是或者在使用 begin() JPA 实体事务的模型中有点违反直觉>和提交()?请注意, 3 和 4 行是必需的,因为注释掉它们不会更改数据库值。
答案 0 :(得分:3)
a
是与em
实例关联的托管实体,可以在事务边界之外进行修改,并将作为从同一实体管理器实例提交事务的一部分进行持久化。事务边界仅定义提交事务时进入数据库的内容以及在事务失败时对数据库所做的更改。假设您的示例中的事务失败,a
仍然会进行更改,只是数据库不会有这些更改,因此其他人不可见。
如果您期望托管实体不应在事务边界之外进行修改,或者在事务边界之外对它们的任何更改不应该持久化,那么事实并非如此。管理实体的生命周期与其实体经理联系在一起。