Использование @TransactionAttribute (value = TransactionAttributeType.NEVER) для метода - PullRequest
5 голосов
/ 23 июня 2011

Можете ли вы вызвать метод, который требует транзакции внутри метода, который этого не делает?

@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 говорит, что он гарантирует, что метод не будет выполняться внутри транзакции, а как насчет вызовов другихметоды внутри этого метода

1 Ответ

11 голосов
/ 23 июня 2011

Аннотация определяет только необходимое состояние транзакции, которое должно существовать при вызове аннотированного метода (в этом случае транзакция не должна существовать). Это не ограничивает то, что может происходить при выполнении метода аннотации. Таким образом, в рамках этого метода вы можете начать новую транзакцию без проблем.

В приведенном вами примере вы можете вызвать метод, для которого требуется транзакция, из метода с параметром транзакции NEVER. В этой ситуации будет создана новая транзакция для вызова метода, который требует транзакции. Если внутренний метод помечен параметром ОБЯЗАТЕЛЬНО, то вызов внутреннего метода завершится неудачей, поскольку существующая транзакция не существует, и параметр ОБЯЗАТЕЛЬНО не создаст ее автоматически для вас.

...