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

Joh*_* F. 28 java google-app-engine jpa transactions

我最近开始在Google App Engine上使用JPA.在阅读一些例子时,我注意到对象持久化的方式存在一些变化.在一个案例中,我看到过这样的事情:

entityManager.getTransaction().begin();
entityManager.persist(object);
entityManager.getTransaction().commit();
Run Code Online (Sandbox Code Playgroud)

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

Pio*_*cki 19

如果您使用容器管理,EntityManager那么您正在使用JTA事务.因此,您不需要(更准确地说 - 您不能)干扰使用EntityManager的提取事务entityManager.getTransaction().JTA启动并提交您的交易.

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

最典型的是,在Java SE环境中使用EntityManager与之配合EntityManager.getTransaction()使用的应用程序.

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

  • GAE不支持JTA. (2认同)

Dat*_*eus 5

在GAE中没有Java EE/JTA,因此忽略诸如bean管理事务(BMT)和容器管理事务(CMT)之类的术语.

您的工作要么是事务性的(您希望多个对象一次转到数据存储区,要么全部失败 - 这是您使用getTransaction()的地方),或者是非事务性的(其中所有内容都是逐个转到数据存储区,并且一个持久化失败不会影响其他人 - 这就是你只需要调用persist()/ merge()/ remove())的地方.