В базе данных Oracle таблица сущностей имеет проверку ограничений (ID < 90). Итак, второй метод persist вызывает SQLException.@TransactionAttribute (REQUIRED) не вызывает никакого эффекта
Но оба фрагмента кода ниже работают одинаково: Первый метод persist не фиксируется даже без JTA Annotations. Почему оба варианта работают одинаково?
@Stateless
public class EntityServiceImpl implements EntityService{
@PersistenceContext
private EntityManager enManager;
@Resource
private SessionContext sessionCtx;
@TransactionAttribute(REQUIRED)
public void updateEntity(List<Entity> entity) {
try {
Entity validEntity = entity.get(10);
enManager.persist(validEntity);
Entity inValidEntity = entity.get(90);
enManager.persist(inValidEntity);
} catch(Exception ex) {
sessionCtx.setRollbackOnly();
throw ex;
}
}
второй фрагмент:
public void updateEntity(List<Entity> entity) {
Entity validEntity = entity.get(10);
enManager.persist(validEntity);
Entity inValidEntity = entity.get(90);
enManager.persist(inValidEntity);
}
persistence.xml
<persistence-unit name="WASLiberty" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.logging.level.sql" value="FINEST"/>
<property name="eclipselink.logging.parameters" value="true"/>
</properties>
</persistence-unit>
РЕДАКТИРОВАТЬ:
От Oracle:
Обязательно Атрибут Если клиент работает в транзакции и вызывает метод корпоративного бина, метод выполняется в транзакции клиента. Если клиент не связан с транзакцией, контейнер запускает новую транзакцию перед запуском метода.
Обязательный атрибут - это неявный атрибут транзакции для всех методов бизнес-компонентов, работающих с демаркацией транзакций, управляемых контейнером. Обычно вы не устанавливаете атрибут Required, если вам не требуется переопределить другой атрибут транзакции. Поскольку атрибуты транзакции являются декларативными, вы можете легко изменить их позже
ли это означает, что нет необходимости объявлять @TransactionAttribute (ТРЕБУЕТСЯ), если не нужен другой TransactionAttributeType кроме «ТРЕБУЕТСЯ»?
Да, вы в основном ответили на свой вопрос :). 'REQUIRED' является значением по умолчанию для всех сессионных компонентов без состояния. Вы только меняете его, если вам требуется поведение по умолчанию. – rapasoft
Yep :) Спасибо, теперь я чувствую себя счастливым :) –