2016-04-18 15 views
1

Oracleデータベースでは、エンティティ表に制約チェック(ID < 90)があります。 したがって、2番目のpersistメソッドはSQLExceptionをスローします。@TransactionAttribute(REQUIRED)は無効です

ただし、以下の両方のコードスニペットは同等に機能します。 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> 

EDIT:オラクルから

必須属性 クライアントがトランザクション内で実行され、エンタープライズBeanのメソッドを呼び出す場合、メソッドはクライアントのトランザクション内で実行されます。クライアントがトランザクションに関連付けられていない場合、コンテナはメソッドを実行する前に新しいトランザクションを開始します。

必須属性は、コンテナ管理のトランザクション境界設定で実行されているすべてのエンタープライズBeanメソッドの暗黙的なトランザクション属性です。別のトランザクション属性を上書きする必要がある場合を除き、通常はRequired属性を設定しません。トランザクション属性は宣言されているので、あなたは後で簡単に

それらを変更することができ、それは我々が「REQUIRED」を除く他のTransactionAttributeTypeを必要としない限り、@TransactionAttribute(REQUIRED)を宣言する必要がないことを意味していますか?

+0

はい、基本的にあなた自身の質問に答えました:)。 'REQUIRED'はすべてのステートレスセッションBeanのデフォルトです。デフォルトの動作が必要な場合にのみ変更します。 – rapasoft

+0

ええ:)ありがとう、今私は幸せ感じている:) –

答えて

1

はい、ご理解ください、@TransactionAttribute(REQUIRED)は、デフォルトの動作です。

セッションビーンとMDBの場合、この注釈はデフォルトで暗黙指定されています。注釈は最初のスニペットで指定したとおりに指定するだけで詳細です。したがって、実際に@TransactionAttributeを指定する必要がある唯一の時間は、REQUIRED以外の値を値として使用している場合です。