2013-11-19 6 views
1

С сохранением контейнера, поддерживаемыми контейнером транзакциями JTA, управляемыми контейнером транзакциями JTA и менеджером сущности, введенным в локальные сеансовые компоненты без состояния, то, что вызывает метод, не поддерживаемый транзакциями, управляемое состояние объекта? Я прочитал: https://community.jboss.org/thread/183007 и аналогичные темы, но, похоже, существует некоторая двусмысленность вокруг того, распространяется ли ПК на метод NOT_SUPPORTED, если они оба используют впрыскиваемые EM с той же фабрики?Управляемый постоянный контейнер EJB3 - когда объект становится неуправляемым

Рассмотрим этот фрагмент из бобов, который собирается получить элемент, а затем вызвать метод из другого боба:

@PersistenceContext 
private EntityManager em; 
@Inject 
private LeanBean leanBean; 

@TransactionAttribute(TransactionAttributeType.REQUIRED) 
public void startHere() { 
    MyItem item = em.find(MyItem.class, key); 
    leanBean.txMethod(item); 
    leanBean.nonTxMethod(item); 
} 

Теперь здесь LeanBean.java. Обратите внимание, что два его метода имеют различные распространения транзакций

@Stateless 
@LocalBean 
public Class LeanBean { 

    @PersistenceContext 
    private EntityManager em; 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void txMethod(MyItem item) { 
     doSomething(item); // item is managed; persistence context propagated with 
    }      // transaction context; em is the same as my caller's em 

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
    public void nonTxMethod(MyItem item) { 
     doSomething(item); // caller's transaction context has been suspsended. 
    }      // did em propagate? is item managed? 

} 

То, что я не могу понять, из спецификации (ы):

  1. Внутри nonTxMethod, является пункт в отдельном государстве? Что должно произойти, если я буду ссылаться на них?
  2. Что делать, если метод в вызывающем фрагменте был аннотирован TransactionAttributeType.NOT_SUPPORTED? было бы состоянием элемента в любом из методов внутри LeanBean?

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

+0

В частности, если, внутри nonTxMethod, я попытался получить доступ к ленивому полю MyItem .... –

ответ

0

Внутри nonTxMethod, является предметом в отдельном состоянии? То, что предполагается , случается, если я ссылаюсь на em?

TransactionAttributeType.NOT_SUPPORTED это просто способ сказать, что ваш метод не нуждается в транзакции, и вы не будете в состоянии вызова сохраняется, объединять или удалять в EntityManager. Но вы все равно можете вызвать другие методы, такие как em.find(Someclass.class,objectId). Поэтому я думаю, что сущность не находится в состоянии отсоединения.

Что делать, если метод в вызывающем фрагменте был аннотированный TransactionAttributeType.NOT_SUPPORTED? было бы состояние элемента в любом из методов внутри LeanBean?

Это будет работать точно так же, как и раньше. Просто убедитесь, что всякий раз, когда вы нанесете TransactionAttributeType.NOT_SUPPORTED в свой метод вызова, например startHere(), все последующие транзакции будут вызывать приостановку транзакций, и если вам нужно trasaction в любом из последующих вызовов, вы должны явно указать TransactionAttributeType.REQUIRED выше этого метода.

И по умолчанию, когда вы вызываете какой-либо метод bean-компонента из-за пределов EJB, пусть из JSP, trasaction будет автоматически запускаться, если вы явно не укажете, что вам не нужна транзакция.

Смежные вопросы