2016-04-18 3 views
1

В базе данных 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 кроме «ТРЕБУЕТСЯ»?

+0

Да, вы в основном ответили на свой вопрос :). 'REQUIRED' является значением по умолчанию для всех сессионных компонентов без состояния. Вы только меняете его, если вам требуется поведение по умолчанию. – rapasoft

+0

Yep :) Спасибо, теперь я чувствую себя счастливым :) –

ответ

1

Да, ваше понимание, что поведение по умолчанию @TransactionAttribute(REQUIRED) является правильным.

Для сеансовых бэндов и MDB эта аннотация подразумевается по умолчанию, указывая аннотацию, как это было в первом фрагменте, просто является многословным. Поэтому единственный раз, когда вам действительно нужно указать @TransactionAttribute, вы используете что-то отличное от REQUIRED для значения.