Jpa @TransactionAttribute(必需)不产生任何影响

Jpa @TransactionAttribute(必需)不产生任何影响,jpa,websphere,jta,websphere-liberty,Jpa,Websphere,Jta,Websphere Liberty,在Oracle数据库上,实体表具有约束检查(ID

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

但以下两个代码段的工作原理相同: 第一个persist方法即使没有JTA注释也不会提交。 为什么两种变体的工作方式相同

@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;
    }
}
@无状态
公共类EntityServiceImpl实现EntityService{
@持久上下文
私人实体经理;
@资源
非公开会议Context SessionTX;
@TransactionAttribute(必需)
公共void updateEntity(列表实体){
试一试{
实体有效性=实体获取(10);
持久性(有效性);
Entity inValidEntity=Entity.get(90);
enManager.persist(无效标识);
}捕获(例外情况除外){
sessionCx.setRollbackOnly();
掷骰子;
}
}
第二段:

public void updateEntity(List<Entity> entity) {
        Entity validEntity = entity.get(10);
        enManager.persist(validEntity);
        Entity inValidEntity = entity.get(90);
        enManager.persist(inValidEntity);
}
public void updateEntity(列表实体){
实体有效性=实体获取(10);
持久性(有效性);
Entity inValidEntity=Entity.get(90);
enManager.persist(无效标识);
}
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>

org.eclipse.persistence.jpa.PersistenceProvider
假的
编辑:

来自Oracle:

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

Required属性是使用容器管理的事务划分运行的所有企业bean方法的隐式事务属性。除非需要重写另一个事务属性,否则通常不设置Required属性。由于事务属性是声明性的,因此您可以稍后轻松地更改它们


这是否意味着不需要声明@TransactionAttribute(必需的),除非我们需要除“必需”之外的另一个TransactionAttribute类型?

是的,您认为
@TransactionAttribute(必需的)
是默认行为是正确的


对于会话bean和MDB,默认情况下,此注释是隐含的,像在第一个代码段中那样指定注释只是冗长而已。因此,您真正需要指定
@TransactionAttribute
的唯一时间是,如果您对值使用的不是
REQUIRED

是的,您基本上得到了答案你自己的问题:)。
必需的
是所有无状态会话bean的默认设置。只有在需要默认行为时才可以更改它。是的:)谢谢,现在我很高兴:)