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. @Autowired不适用于static字段。

  2. 从 DAO 控制事务没有多大意义,因为事务边界通常在服务层中定义,因此单个事务可以涉及多个 DAO。

  3. 为什么你需要所有这些东西?Spring 可以隐式地为您完成,请参阅10. Transaction Management13.3 Hibernate。您所需要做的就是定义事务边界(使用@Transacionalor TransactionTemplate)并将 DAO 中的当前会话获取为sessionFactory.getCurrentSession().

于 2012-06-25T19:15:09.730 回答