トランザクション管理を理解し、Struts 2、EJB 3およびHibernate 5.2で開発された既存のアプリケーションでその権限を使用しようとしています。私はそのトランザクション管理は、(私の場合は、EJBで)サービス層で行われる必要があります理解EJB 3.0および休止状態でのトランザクション管理
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class MyEJb implements ejbxyz {
@Override
public void method(){
Dao dao=new Dao() //Dao class is simple java class
dao.fooMethod(); //this method updates some record
dao.barMethod(); // this method updates some other record
}
}
public class Dao{
fooMethid(){
Session session=sessFactory.openSession();
session.beginTransaction();
session.update(x);
}
barMethod(){
try{
Session session=sessFactory.getCurrentSession();
session.getNamedQuery("xyz").executeUpdate();
}catch(HibernateException ex){
session.getTransaction.rollback();
}
}
}
以下のように は今、私は私のビジネス層でEJBを持っています。しかし、私はそこでこれをどのように達成することができますか? ?
barMethod()がレコードを更新できない場合は、fooMethodで行った変更をロールバックする必要があります。ですから、基本的には両方のメソッドを1つのトランザクションで処理する必要があります。 私はアプリケーションを実行すると、私はbarMethod内の任意のトランザクションを開始するわけではないので、それは以下の例外
Exception while barMethod getNamedQuery is not valid without active transaction
そのをスローします。しかし、私は本当に新しいトランザクションを開始したくないし、fooMethodで開始された古いトランザクションを続行したいと考えています。
あなたが言ったように:*トランザクション管理はサービス層*で行う必要があります。ステートレスなEJBを使用しているため、トランザクションを開始してコミットします。したがって、DAOメソッドのトランザクションを処理しないでください。トランザクションは、EJBコンテナによって自動的に処理されます。また、独自のHibernate APIを使用しないでください。 JPAを使用してください。 –
@JBNizet「独自のHibernate APIを使用しないでください.JAを使用してください。 JPAの実装を休止していないのですか? –
Java EEにはJPAという標準仕様があります。これは、標準インターフェース(EntityManager ...)、メソッド、注釈を定義します。 HibernateはJPAの実装です。独自のHibernate Session APIではなく、標準APIを使用する必要があります。 –