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

Luk*_*uke 5 java persistence annotations ejb transactions

你可以调用一个方法,该方法需要在一个方法中没有事务吗?

@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

}
Run Code Online (Sandbox Code Playgroud)

.NEVER属性表示它将保证方法不在事务内运行,但是调用该方法中的其他方法

Kri*_*bic 11

注释仅定义在调用带注释的方法时必须存在的必需事务状态(在这种情况下,事务不能存在).它不限制在注释方法的执行中可能发生的事情.因此,在此方法中,您可以毫无问题地启动新事务.

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

  • 重新阅读问题和答案后,很明显第二个(内部)方法的调用是常规方法调用,而不是由EJB容器处理.这里回答http://stackoverflow.com/questions/427452/ejb-transactions-in-local-method-calls (2认同)