在一个方法上使用@TransactionAttribute(value = TransactionAttributeType.NEVER)

6
你能在不需要事务的方法中调用需要事务的方法吗?
@TransactionAttribute(value = TransactionAttributeType.NEVER)
public void DoSomething(final List<Item> items) {

//can you call a method that requires a transaction here ?
for (Item i : items) {
    methodCall(item);

}

@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public void methodCall(final Item item) {
    // access lazily loaded item properties
    item.getSalesOrder();
    item.getAllocation();

    //throws org.hibernate.LazyInitializationException: could not initialize proxy - no Session

}

.NEVER属性表示该方法不会在事务中运行,但是对于该方法内部调用其他方法呢?

您可以在类级别应用@TransactionAttribute注释,以指定企业Bean的所有业务方法的默认事务属性。您可以在方法级别应用此注释,以指定该方法的事务属性。在方法级别应用注释将覆盖该方法的类级别注释(如果有)。 - Luke
1个回答

11

此注释仅定义在调用被注释方法时必须存在的所需事务状态(在这种情况下,不应存在事务)。它不限制在注释方法执行期间可能发生的任何事情。因此,在此方法中,您可以轻松地启动新的事务。

在您提供的示例中,您可能需要从具有事务设置为NEVER的方法中调用需要事务的方法。在这种情况下,将为需要事务的方法调用创建一个新事务。如果内部方法标记为MANDATORY,则由于不存在现有事务且MANDATORY设置不会自动为您创建事务,内部方法调用将失败。


谢谢您澄清这一点。我看不出为什么它不能工作,但是我无法访问内部方法调用中的惰性加载属性(即使它带有requires new注释)。 - Luke
你的顶级 Bean 是如何访问内部 Bean(itemBean)的?itemBean 是否也是容器管理的,还是直接实例化的(事务注解仅支持托管 Bean)?此外,你所提到的延迟加载属性是什么,以及它们如何与事务相关联(如果有的话)? - Kris Babic
每个项目都有一个销售订单和一个分配,它们都是惰性加载的,以及与此特定事务无关的其他属性。在这种情况下,两种方法都在同一个bean上,因此我的代码示例不应该有itemBean前缀。 - Luke
2
重新阅读问题和您的答案后,显然第二个(内部)方法的调用是常规方法调用,而不是由EJB容器处理的。在此处回答:https://dev59.com/mXRC5IYBdhLWcg3wCMrX - Luke

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