2016-03-30 17 views
2

私はJPAを使用しています。私は抽象クラスを持っています。私は自分のentityManagerを挿入して、ジェネリックメソッドを持っています。データベースにオブジェクトを保存し、すべてのサービスクラスでその抽象クラスを継承します。クライアントとクライアントの詳細を保持しますが、クライアントの永続性に例外がある場合、私のプログラムはクライアントの詳細を保持します。なぜ、私は持続例外があるときにロールバックを探します。@PersistenceContextによって挿入されたEntityManagerのトランザクションをロールバックする方法はありますか?

私はentityManager.getTransaction().rollback();のようにすることができますが、私のエンティティマネージャを管理していますが、私の場合はコンテナで管理しています。ここで

は私の抽象クラスです:

public abstract class AbstractEntityFactory<E>{ 
protected static final transient Logger LOGGER = CommonLogger.getLogger(AbstractEntityFactory.class); 
@PersistenceContext(unitName = "Test_PU") 
@Transient 
@XmlTransient 
private transient EntityManager entityManager; 

public E persist(final E arg0) { 
    LOGGER.debug("persist : Begin"); 
    this.getEntityManager().persist(arg0); 
    this.getEntityManager().flush(); 
    LOGGER.debug("persist : End"); 
    return arg0;   
} 

}

NB:私はあなたが現在のトランザクションをロールバックするUserTransaction.rollbackを使用して試すことができますサーバー

+0

を経由して、それを得ることができる必要がありますか?しかし、 'RuntimeException'をスローするだけでトランザクションをロールバックする必要があります。それは起こっていないのですか? –

+0

例外が発生した場合は、すべてのコンテナがトランザクションをロールバックし、永続性例外が発生した場合は、JPAによってロールバック用のトランザクションにマークする必要があります。あなたはあなたが解決しようとしている問題についてもっと詳しく説明できますか? – Chris

答えて

0

のJBoss AS EAP6を持っています。

+0

私はトランザクションをしないトランザクションの終了を終了し、コンテナはこれを行いません。上記のように、@PersistenceContextによってentityManagerを挿入します。 – Abdel

0

「コンテナ」を使用しているためです。私はあなたがwildflyのようなものを意味すると仮定します。 その場合、私はあなたのどこかで@Transactionalを使用すると仮定します。このアノテーションにはrollbackForという属性があります。

私が正しく覚えていれば、デフォルト設定はRuntimeExceptionsのロールバックではありません。だからあなたはこれを変えるかもしれない。

手動でロールバックする必要がある場合は、UserTransactionを使用します。それは、EntityManagerを注入された春あなたは

public class SomeBean { 

    @Resource 
    private UserTransaction transaction; 
} 
+0

私はUserTransactionを使用しません。 – Abdel

+0

あなたはいつでもトランザクションを制御します。 –

+0

私は、私のメソッドで見るように '@ PersistenceContext'を介してentityManagerを挿入していると思います。私のオブジェクトを永続化してから、私は何をしているのか、そして私のpersistence.xmlにはflushを行います。' transaction-type = "JTA" ' – Abdel

0
you can use transaction rollback support annotation : 

` @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class) 
    public E persist(final E arg0) { 
    LOGGER.debug("persist : Begin"); 
    this.getEntityManager().persist(arg0); 
    this.getEntityManager().flush(); 
    LOGGER.debug("persist : End"); 
    return arg0;   
}` 
+0

@Transactional(propagation = Propagation.REQUIRED、rollbackFor = Exception.class)はSpring用ですか?私はそれを使用せず、私はJPAとEJBとCDIを使用するので – Abdel

関連する問題