gpt4 book ai didi

jakarta-ee - CDI事务管理: How does @Transactional work?

转载 作者:行者123 更新时间:2023-12-02 20:24:10 25 4
gpt4 key购买 nike

在 session 范围内有一个简单的 CDI bean,并注入(inject)实体管理器:

@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: Transaction is required to perform this operation (either use a transaction or extended persistence context)

2)用 @Transactional 装饰 testInsert() ,该函数立即返回,但 JPA 仍在后台线程中更新数据库。该过程只需要 2 分钟即可完成仅 50000 条记录的 INSERT。当关闭进程内的 Java EE 应用程序服务器时,后台进程会停止,因此 - 在我看来 - testInsert() 不是事务性的。

我在这里的一般误解是什么?如何正确管理交易?

最佳答案

@javax.transaction.Transactional 是 Java EE 7 中引入的拦截器绑定(bind)。CDI 为您的 bean 注入(inject)的代理将拦截带注释的方法调用以将它们包装在事务中。

拦截器不适用于私有(private)方法 - 我认为这是您的示例的主要问题。

关于jakarta-ee - CDI事务管理: How does @Transactional work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24035923/

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