1

Spring 3.1 と Hibernate 3 のプロジェクトがあります。DAO を定義しようとしています。セッションの取得、コミット、ロールバックなどのメソッドを備えた抽象DAOクラスがあります。私の問題は、このクラスにSessionFactoryを注入することです。このクラスを定義するより良い方法があるかどうか疑問に思っています。ありがとうエリック

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

public abstract class AbstractDAO {


    @Autowired
    private static SessionFactory sessionFactory;

    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

    protected static Session getSession() {
        Session session = threadLocal.get();
        if (session == null) {
            session = sessionFactory.openSession();
            threadLocal.set(session);
        }
        return session;
    }

    protected void begin() {
        getSession().beginTransaction();
    }

    protected void commit() {
        getSession().getTransaction().commit();
    }

    protected void rollback() {
        try {
            getSession().getTransaction().rollback();
        }
        catch (HibernateException ex) {
            ex.printStackTrace();
        }           
        close();
    }


    protected void close() {
        try {
            getSession().close();
        }
        catch (HibernateException ex) {
            ex.printStackTrace();
        }
        threadLocal.set(null);
    }



}
4

1 に答える 1

4
  1. @Autowiredstaticフィールドでは機能しません。

  2. 通常、トランザクション境界はサービス層で定義されるため、DAO からトランザクションを制御することはあまり意味がありません。そのため、1 つのトランザクションに複数の DAO が関与する可能性があります。

  3. なぜこれらすべてが必要なのですか?Spring は暗黙的にそれを行うことができます。 10. トランザクション管理および13.3 Hibernateを参照してください。必要なのは、(@Transacionalまたはを使用してTransactionTemplate) トランザクション境界を定義し、DAO の現在のセッションを として取得することだけsessionFactory.getCurrentSession()です。

于 2012-06-25T19:15:09.730 に答える