@TransactionAttribute(REQUIRED)无效

时间:2016-04-18 07:46:39

标签: jpa websphere jta websphere-liberty

在Oracle数据库中,实体表具有约束检查(ID <90)。 因此,第二个持久化方法抛出SQLException。

但是下面的两个代码片段同样有效: 即使没有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:

必需属性 如果客户端在事务中运行并调用企业bean的方法,则该方法在客户端的事务中执行。如果客户端未与事务关联,则容器在运行方法之前启动新事务。

Required属性是使用容器管理的事务划分运行的所有企业bean方法的隐式事务属性。除非需要覆盖其他事务属性,否则通常不会设置Required属性。由于事务属性是声明性的,因此您可以在以后轻松更改

这是否意味着除非我们需要另外一个TransactionAttributeType除了“REQUIRED”之外没有必要声明@TransactionAttribute( REQUIRED )?

1 个答案:

答案 0 :(得分:1)

是的,您理解@TransactionAttribute(REQUIRED)是默认行为是正确的。

对于会话bean和MDB,默认情况下隐含此注释,指定注释,因为您在第一个片段中所做的只是详细。因此,如果您使用@TransactionAttribute以外的其他内容来表示值,那么您唯一真正需要指定REQUIRED的时间。