2015-04-08 1 views
0

Прежде всего, я должен извиниться за код полу-psuedo, поскольку классы, которые я собираюсь использовать, слишком большие и бессмысленны, за исключением нескольких строк каждого класса, которые задают мой вопрос. Для начала я использую Jboss 6.3.2 EAP гибернации EJB 3.0Hibernate/JPA TransactionManagment

У меня есть два разных классов EJB

Они

Service Layer

@Stateless 
@TransactionManagement 
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
public class ServiceClass implements ILocalService 
{ 
    @EJB 
    ILocalDao localDao; 

    @Override 
    public myObject find(String id) 
    { 
     localDao.findByPK(id); 
    } 

    @TransactionalAttribute(TransactionAttributeType.REQUIRED) 
    @Override 
    public void create(myObject obj) 
    { 
     localDao.create(obj); 
    } 

    @TransactionalAttribute(TransactionAttributeType.REQUIRED) 
    @Override 
    public void update(myObject obj) 
    { 
     localDao.findByPK(obj.getId()); 
     localDao.update(obj); 
    }  
} 

DAO Layer

@Stateless 
@TransactionalAttribute(TransactionAttributeType.MANDATORY) 
public class DaoClass extends AbstractDaoClass<myObject> implements ILocalDao 
{ 
    @Override 
    public myObject findByPK(String id) 
    { 
     super.find(id); 
    } 
} 

Хорошо с этими двумя классами. Поверьте мне, что все остальное правильно сконфигурировано интерфейсом Classes, Abstract Class, persistence.xml и т. Д.

Вопрос: Как работает метод find в ServiceClass? Если NOT_SUPPORTED присваивается этому методу, я думаю, что вызов DaoClass вызовет исключение, потому что транзакция еще не запущена, и я делаю весь класс MANDATORY. Но мое приложение работает иначе.

  1. Чтобы убедиться, что транзакция не создается по методу DaoClass.find. Я ввел атрибут @TransactionalAttribute (TransactionAttributeType.NEVER). И повторно запустить приложение. До сих пор работает.
  2. Чтобы убедиться, что НИКОГДА не работает, я вызываю метод обновления ServiceClass. Выдает исключение, как ожидалось.

Чтобы закруглить все это, что я смотрел на многих интернет-ресурсах (http://docs.oracle.com/javaee/6/tutorial/doc/bncij.html и т.д.) Я посмотрел в исходные файлы для EJB 3.0 и Jboss ... Я ничего не вижу.

Так вопросы я обдумывал

  1. ли TransctionAttributeType.MANDATORY на уровне класса не работает, как я ожидаю, что это в DaoClass?
  2. Управление транзакциями на ServiceClass, создающее транзакцию при инициализации ServiceClass, а затем NOT_SUPPORTED, приостановив эту транзакцию?

Я нахожусь в процессе написания некоторых тестов, чтобы, надеюсь, зарегистрировать поведение транзакции и посмотреть, что происходит. Но, надеюсь, кто-то здесь может пролить некоторый свет раньше и снять этот огромный знак вопроса, который у меня есть.

Заранее спасибо.

ответ

0

Во-первых, @TransactionManagement без параметров бесполезно, поскольку значение по умолчанию - TransactionManagementType.CONTAINER и EJB неявно использует TransactionManagementType.CONTAINER.