@TransactionAttribute(REQUIRED) 没有效果
@TransactionAttribute(REQUIRED) cause no effect
在 Oracle 数据库上,实体 Table 具有约束检查(ID < 90)。
所以,第二个 persist 方法抛出 SQLException。
但下面的两个代码片段同样有效:
即使没有 JTA 注解,第一个 persist 方法也不会提交。
为什么两种变体的工作方式相同?
@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>
编辑:
来自甲骨文:
必需 属性
如果客户端在事务中 运行 并调用企业 bean 的方法,则该方法在客户端的事务中执行。如果客户端未与事务关联,则容器在 运行 方法之前启动一个新事务。
Required 属性是所有企业 bean 方法的隐式事务属性 运行 容器管理的事务划分。您通常不会设置 Required 属性,除非您需要覆盖另一个事务属性。因为事务属性是声明性的,所以您可以稍后轻松更改它们
是否意味着不需要声明@TransactionAttribute(REQUIRED) 除非我们需要除"REQUIRED"之外的另一个TransactionAttributeType?
是的,您对 @TransactionAttribute(REQUIRED)
是默认行为的理解是正确的。
对于会话 bean 和 MDB,此注释默认是隐含的,像您在第一个片段中所做的那样指定注释只是冗长。因此,您真正需要指定 @TransactionAttribute
的唯一情况是您使用的值不是 REQUIRED
。
在 Oracle 数据库上,实体 Table 具有约束检查(ID < 90)。 所以,第二个 persist 方法抛出 SQLException。
但下面的两个代码片段同样有效: 即使没有 JTA 注解,第一个 persist 方法也不会提交。 为什么两种变体的工作方式相同?
@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>
编辑:
来自甲骨文:
必需 属性 如果客户端在事务中 运行 并调用企业 bean 的方法,则该方法在客户端的事务中执行。如果客户端未与事务关联,则容器在 运行 方法之前启动一个新事务。
Required 属性是所有企业 bean 方法的隐式事务属性 运行 容器管理的事务划分。您通常不会设置 Required 属性,除非您需要覆盖另一个事务属性。因为事务属性是声明性的,所以您可以稍后轻松更改它们
是否意味着不需要声明@TransactionAttribute(REQUIRED) 除非我们需要除"REQUIRED"之外的另一个TransactionAttributeType?
是的,您对 @TransactionAttribute(REQUIRED)
是默认行为的理解是正确的。
对于会话 bean 和 MDB,此注释默认是隐含的,像您在第一个片段中所做的那样指定注释只是冗长。因此,您真正需要指定 @TransactionAttribute
的唯一情况是您使用的值不是 REQUIRED
。