Прежде всего, я должен извиниться за код полу-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. Но мое приложение работает иначе.
- Чтобы убедиться, что транзакция не создается по методу DaoClass.find. Я ввел атрибут @TransactionalAttribute (TransactionAttributeType.NEVER). И повторно запустить приложение. До сих пор работает.
- Чтобы убедиться, что НИКОГДА не работает, я вызываю метод обновления ServiceClass. Выдает исключение, как ожидалось.
Чтобы закруглить все это, что я смотрел на многих интернет-ресурсах (http://docs.oracle.com/javaee/6/tutorial/doc/bncij.html и т.д.) Я посмотрел в исходные файлы для EJB 3.0 и Jboss ... Я ничего не вижу.
Так вопросы я обдумывал
- ли TransctionAttributeType.MANDATORY на уровне класса не работает, как я ожидаю, что это в DaoClass?
- Управление транзакциями на ServiceClass, создающее транзакцию при инициализации ServiceClass, а затем NOT_SUPPORTED, приостановив эту транзакцию?
Я нахожусь в процессе написания некоторых тестов, чтобы, надеюсь, зарегистрировать поведение транзакции и посмотреть, что происходит. Но, надеюсь, кто-то здесь может пролить некоторый свет раньше и снять этот огромный знак вопроса, который у меня есть.
Заранее спасибо.