- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我们声明了一个应用程序管理的实体管理器,如下所示(可以在以下位置找到类似的版本: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/
我之前使用过应用程序管理的 RESOURCE-LOCAL 事务,但现在我想使用容器管理的 JTA 事务。当我使用 @Stateless 时,一切似乎都正常,但是一旦我使用 @Stateful,我就会收
我一直在尝试按照文档 Drools-Flow-Persistence 配置持久性以在 JBOSS 6.0.0.Final 上使用 drools 流但我一直收到如下异常(尽管 hibernate 确实创
我正在使用带注释的 JPA2 和 EclipseLink,我想知道两者之间是否有区别 EntityManager em = ... // Some action em.joinTransaction(
我是一名优秀的程序员,十分优秀!