1

Web アプリケーションに Struts2.3 + Spring 3.2.6 + Hibernate 3.X を使用しています。

アノテーションを使用してトランザクションを管理しています。私のDAOクラスは以下の通りです。

@Transactional(readOnly = true, rollbackFor={Exception.class})
public class CustomerDAOImpl extends HibernateDaoSupport implements CustomerDAO{

    //adds the customer
    @Transactional(propagation=Propagation.REQUIRED, rollbackFor = {Exception.class})
    public void addCustomer(Customer customer){
        Session session = getSession();
        System.out.println("M1() Hash Code: --->"+session.hashCode()+ " Thread id: "+Thread.currentThread().getId());
        //session.save(customer);
    }

    //return all the customers in list
    // @Transactional(propagation=Propagation.REQUIRED, rollbackFor = {Exception.class})
    @Transactional(readOnly = true)
    public List<Customer> listCustomer(){
        Session session = getSession();
        System.out.println("M2() Hash Code: --->"+session.hashCode()+ " Thread id: "+Thread.currentThread().getId());
        return null; //logic to get the list based on condition

    }

これらのメソッドはサービス層から呼び出され、以下のようになります。

customerDAO.addCustomer(customer);
customerDAO.listCustomer();

上記のコードを実行すると、同じスレッドに対して異なるセッションが発生します。

出力:

M1() Hash Code: --->5026724 Thread id: 21
M2() Hash Code: --->8899550 Thread id: 21

このため、 method2() で例外が発生した場合、 method1() を使用して永続化されたデータは rollback ではありません

春のトランザクション管理を失うことなく、スレッドに基づいて単一のセッションを取得する方法を教えてください(私が自分の HibernateFactory に行くと、Spring によるトランザクション管理が失われます)。

4

1 に答える 1