gpt4 book ai didi

java - JPA:一个关于entityManager.joinTransaction的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:20 24 4
gpt4 key购买 nike

假设我们声明了一个应用程序管理的实体管理器,如下所示(可以在以下位置找到类似的版本:http://download.oracle.com/docs/cd/E19798-01/821-1841/bnbqy/index.html):

@PersistenceUnit EntityManagerFactory emf;
@Resource UserTransaction utx;
protected void doPost(HttpServletRquest req,...)
em = emf.createEntityManager();
try {
utx.begin(); //(1)
em.persist(SomeEntity);
utx.commit();
} catch (Exception e) {
utx.rollback();
}

虽然代码工作正常,但有几张来自 SUN 架构师的幻灯片(例如:http://www.scribd.com/doc/6616366/TS49452007JavaEE)指出该 block 有问题,应该在行后添加“em.joinTransaction()”( 1)(幻灯片 #50)。

如果发生异常,持久上下文不一致,我们只需关闭em,那么这里可能是什么潜在错误?

非常感谢我遗漏的任何建议。谢谢。

最佳答案

是的,从 JTA 的角度来看,您显示的代码存在错误。

您需要通过调用 em.joinTransaction() 告诉 EM 您希望它成为分布式事务的一部分。如果您不调用该方法,则用户事务和 EM 事务将断开连接。该方法的 javadoc 状态:

Indicate to the EntityManager that a JTA transaction is active.

您还可以看到,当您调用 em.joinTransaction 时,EM 不需要启动事务。如果您不在 JTA 环境中,那么您需要调用 em.getTransaction().begin() 和 em.getTransaction.commit(),但由于您在 JTA 事务中,UserTransaction 负责启动,提交或回滚。


关于第二个问题,你那里的代码没有问题,好像有异常,你根本就没有调用EM。 但是 如果出现异常,您可以(并且应该)调用的唯一方法是 em.close()。如果您尝试做任何其他事情,例如调用 em.find(),EM 将抛出 InvalidStateException。

我希望我写的很清楚...JTA 是一个复杂的怪物。

关于java - JPA:一个关于entityManager.joinTransaction的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6704064/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com