3

みなさん、こんにちは。次の問題について助けを求めています。完全に機能するjpa / stateless ejbのプロジェクトがあり、単純なクエリと永続化操作を実行するだけですが、永続化操作のセットを実行する必要があります。それらは失敗します。ロールバックを実行する必要があるため、JTAがその仕事を実行できることがわかりましたが、このソースコードを使用しています。

@Stateless
public class ProjectBean implements IProject {

@Resource
javax.transaction.UserTransaction utx;
@PersistenceContext(unitName = "JPADB")
private EntityManager entityManager;
  ...
 //more code

//this is part of a method
try{
utx.begin();
entityManager.joinTransaction();
    for(Project p:projectResultList){
                entityManager.persist(p);
            }
            utx.commit();
        }catch(Exception e){
            e.printStackTrace();
            if(utx != null)
                try {
                    utx.rollback();
                } catch (IllegalStateException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (SecurityException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (SystemException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                //tx.rollback();
        }

単に機能しません。persistence.xmlは次のようになります。

<persistence-unit name="JPADB">
<jta-data-source>java:jboss/datasources/OracleBic</jta-data-source>
    <properties>
        <property name="hibernate.show_sql" value ="true" />
        <property name="hibernate.dialect"  value="org.hibernate.dialect.Oracle10gDialect" />
    </properties>
</persistence-unit>

誰かが私にヒントやアドバイスをくれることを本当に願っています、私はjpa / jtaの概念の初心者であり、Webで見つけた多くのコードを試しましたが、常に異なるエラーが発生します(スレッドの間違ったtx:予期されるTransactionImple usertransaction begin、Cannot JTAの使用中にEntityTransactionを使用します)。前もって感謝します。

4

2 に答える 2

2

メソッドレベルで@TransactionManagement(TransactionManagementType.BEAN)を使用してトランザクションを手動で処理することをASに指示しましたか?クラスレベルで注釈が表示されません。おそらくメソッドレベルでそれを持っていますが、切り取られたコードは推測するには不十分です。そうしないと、すべてのトランザクションがコンテナ管理され、コードが機能しなくなります。したがって、@ TransactionManagement(TransactionManagementType.BEAN)をメソッドまたはクラスレベルのいずれかに配置する必要があります。要件に応じて、またはコンテナがトランザクションを管理できるようにし、@remigioが提案した変更を加える必要があります。あなたの場合は2番目のアプローチの方が良いようです

于 2012-11-14T18:20:39.613 に答える
0

remigioのコメントは正しいです。@StatelessセッションBeanはjavax.ejb。@TransactionAttributeでトランザクション境界を制御します。アノテーションがない場合、すべてのパブリックメソッドはTransactionAttribute.REQUIREDです。詳細については、http: //download.oracle.com/otndocs/jcp/ejb-3_0-fr-eval-oth-JSpec/(ejb-3_0-fr-spec-ejbcore.pdf)を参照してください。

UserTransactionは、@ StatelessセッションBeanで使用されることはなく、メソッド呼び出し自体よりも広いトランザクションウィンドウを区切るためにBeanを呼び出しているクライアントによって使用されます。

于 2012-11-14T15:05:17.157 に答える