【发布时间】:2014-06-04 11:13:33
【问题描述】:
在会话范围内拥有一个简单的 CDI bean,并注入了一个实体管理器:
@Named("myBean")
@SessionScoped
public class MyBean implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
EntityManager em;
...
@Transactional
private void testInsert() {
long t = System.currentTimeMillis();
for (int i=1; i<50000; i++) {
create(i);
}
System.out.println("Time: " + Long.toString(System.currentTimeMillis()-t));
}
private void create(int i) {
Project p = new Project("Project " + i);
em.persist(p);
}
}
现在,当通过 EL #{myBean.testInsert} 调用函数时,有两件事似乎很奇怪:
1) 将 @Transactional-annotation 移动到我得到的方法 create(int):
javax.persistence.TransactionRequiredException: JBAS011469: 执行此操作需要事务(使用 事务或扩展持久性上下文)
2) 改用 @Transactional 装饰 testInsert(),该函数立即返回,但 JPA 仍在后台线程中更新数据库。该过程需要 2 分钟才能完成仅 50000 条记录的 INSERT。在进程中关闭 Java EE 应用程序服务器时,后台进程停止,因此 - 在我看来 - testInsert() 不是事务性的。
我在这里的一般误解是什么?如何正确管理交易?
【问题讨论】:
标签: jakarta-ee jpa transactions ejb cdi