EJB方法级别事务属性覆盖

3
我有一个CDI谈话范围的操作类,我还制作了一个状态ful 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()方法,但是调用该方法时并没有启动事务,为什么呢?

请帮助我解决这个问题。

1个回答

4

你有两个问题:

a)persist() 方法不是一个业务方法。业务方法必须是(其他规则之一)公共的。

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

一个可能的解决方案是创建另一个包含 persist() 方法代码的 EJB 并将其注入到 MyAction bean 中。 这样,每次调用 persist() 方法时,容器都会拦截调用并创建一个新事务。


我知道有其他的选择,但只是想在同一个EJB中尝试一下!感谢提醒“@TransactionAttribute注释需要由容器解释”。 - Syd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接