JPA - 在持久化对象时何时使用 getTransaction()

2022-09-01 14:37:46

我最近开始在Google App Engine上使用JPA。在阅读一些示例时,我注意到对象持久化方式的一些变化。在一个案例中,我看到了这样的东西:

entityManager.getTransaction().begin();
entityManager.persist(object);
entityManager.getTransaction().commit();

在其他情况下,我没有看到.我只是看到.什么时候适合使用?getTransaction()entityManager.persist(object)getTransaction()


答案 1

如果使用容器托管,则使用的是 JTA 事务。因此,您不需要(更准确地说 - 您不能)干扰 使用 获取的事务。JTA 启动并提交您的事务。EntityManagerEntityManagerentityManager.getTransaction()

如果您使用应用程序托管,并且您不想参与 JTA 事务,那么您需要自己管理它们(它称为资源本地实体管理器)。EntityManager

大多数情况下,在 Java SE 环境中使用与之配合使用的应用程序托管。EntityManagerEntityManager.getTransaction()

编辑:您可能对 JPA 2.0 规范中的 secion 7.5 控制事务感兴趣。


答案 2

在GAE中没有Java EE / JTA,因此请忽略Bean托管事务(BMT)和容器管理事务(CMT)等术语。

您的工作要么是事务性的(您希望多个对象一次进入数据存储,要么全部失败 - 这是您使用getTransaction()的地方),要么是非事务性的(所有内容都逐个进入数据存储,并且一个持久性的失败不会影响其他对象 - 这是您只需调用tend()/merge()/remove()的地方)。


推荐