2017-03-14 9 views
0

この2つのクラスを検討してください:EmployeeDetailDAOImplとEmployeeDAOImpl。新しい従業員を作成する場合は、EmployeeDetailの新しいレコードも作成する必要があります。入れ子セッション/トランザクションでTransaction.rollbackはどうなりますか?

detailDAO.create(employeeId)コールの後に発生した例外のために、外部トランザクション(EmployeeDAOImplのtx)がロールバックされるかどうか、新しいEmployeeDetailのトランザクションもロールバックされますか?

public class SessionHandler { 
    public static getSession() { 
     return Configuration.buildSessionFactory().openSession(); //ignore the isConnected or other exception handling for now 
    } 
} 

public class EmployeeDetailDAOImpl { 
    public void create(Serializable employeeId) { 
     Session session = SessionHandler().getSession(); 
     Transaction tx = session.beginTransaction(); 
     try { 
      EmployeeDetail detail = new EmployeeDetail(employeeId); 
      session.save(detail); 
     } catch (Exception e) { 
      if (tx!= null) { 
       tx.rollback; 
      } 
     } 
     session.close(); 
    } 
} 

public class EmployeeDAOImpl { 
    public void add(String name) { 
     Session session = SessionHandler().getSession(); 
     Transaction tx = session.beginTransaction(); 
     try { 
      Employee employee = new Employee(name); 
      Serializable employeeId= session.save(employee); 
      EmployeeDetailDAOImpl detailDAO = new EmployeeDetailDAOImpl(); 
      detailDAO.create(employeeId); 
      //more things here, that may through exceptions. 
     } catch (Exception e) { 
      if (tx!= null) { 
       tx.rollback; 
      } 
     } 
     session.close(); 
    } 
} 

答えて

0

はい、エンティティEmployeeもロールバックします。他のエンティティが関連しているかどうかにも依存しません。 トランザクションの範囲によって異なります。ここには、EmployeeとEmployeeDetailsの両方が含まれます。

0

各メソッドに2つの異なるトランザクションを作成しています。

トランザクションをロールバックするには、トランザクションでプロパゲーションが必要です。あなたは以下のようなコードを記述する必要があります::以下

@Transactional(propagation=Propagation.REQUIRED) 
public void testRequired(User user) { 
    testDAO.insertUser(user); 
    try{ 
    innerBean.testRequired(); 
    } catch(RuntimeException e){ 
    // handle exception 
    } 
} 

はプロパゲーションの詳細については、リンクです。 http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/transaction/annotation/Propagation.html

http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial

1

実際には、所与の回答はいずれも100%正確ではありません。

それは発呼者/サービスによって異なります。

EJBからメソッドを呼び出す場合は、両方のメソッド呼び出しを処理するトランザクションが1つあります。そうすれば、トランザクションは例外の場合に両方の操作をロールバックします。この理由は、annotationまたはejbデプロイメント記述子に別途指定されていない限り、EJBのすべてのメソッドがTransaction Requiredであるという理由があります。

春などのDIフレームワークを使用している場合は、構成によって異なります。通常のセットアップでは、JPA EJBが独自のトランザクションを作成するため、呼び出しトランザクションは一時停止されます。ただし、JTATransactionManager(As specified here)を使用して、EJBとSpring Beanの両方が同じトランザクションを共有していることを確認することができます。

POJOからJPAメソッドを呼び出す場合は、JTAトランザクション処理を自分で処理する必要があります。

関連する問題