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)を宣言する必要がないことを意味していますか?
はい、基本的にあなた自身の質問に答えました:)。 'REQUIRED'はすべてのステートレスセッションBeanのデフォルトです。デフォルトの動作が必要な場合にのみ変更します。 – rapasoft
ええ:)ありがとう、今私は幸せ感じている:) –