gpt4 book ai didi

java - 方法级的 EJB 事务属性覆盖

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

我有一个 CDI 对话范围的操作类,我也在制作一个有状态的 EJB,用于在整个对话生命周期中保存对象的状态。

由于操作类是一个 EJB,所以默认情况下所有方法都是事务性的,我故意不想这样做。我只希望操作类的单个方法是事务性的,我将只执行数据库持久性任务。所以我用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 注释了那个单一的方法。并且操作类使用@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 注释。

当我从同一操作类的其他处理程序方法调用事务方法时,没有事务启动。

这是代码示例。

@Stateful
@Named
@ConversationScoped
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class MyAction implements Serializable {

@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
........
........
........

public String handlerMethod1() {
// do some staffs.
persist();
return "view";
}

public String handlerMethod2() {
// do some staffs.
persist();
}

.......
.......
.......

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void persist() {
// save objects.
em.flush();
}
}

虽然我已经用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 对其进行了注释,但在调用 persist() 方法时没有事务启动,但这是为什么呢?

请帮我摆脱这个。

最佳答案

这里有两个问题:

a) persist() 不是 business method .业务方法必须(除其他规则外)是公开的。

b) 您使用简单的对象方法调用来调用 persist() 方法,因此,容器无法管理代码。请记住,@TransactionAttribute 注释需要由容器解释,在这种情况下不会发生。

一种可能的解决方案是使用 persist() 方法代码创建其他 EJB,并将其注入(inject) MyAction bean。这样,每次调用 persist() 方法时,Container 都会拦截该调用并创建一个新事务。

关于java - 方法级的 EJB 事务属性覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24378733/

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