DAO管理交易的设计是否糟糕?

Jam*_*mes 8 java hibernate data-access-layer

我一直在阅读关于太阳蓝图的GenericDAO实现和Gavin King对Hibernate的使用.他似乎没有提到有关交易处理的任何事情:

public abstract class GenericHibernateDAO<T, ID extends Serializable> {
    protected Session getSession() {
        return HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public T makePersistent(T entity) {
        getSession().saveOrUpdate(entity);
        return entity;
    }
}
Run Code Online (Sandbox Code Playgroud)

我很困惑我应该把交易的开始/结束放在哪里.目前,他们在DAO内部扩展了这一点GenericHibernateDAO

public class FooHibernateDAO extends GenericHibernateDAO<Foo, Long> {
    public Foo saveFoo(Foo foo) {
        getSession().beginTransaction();
        makePersistent(foo);
        getSession().getTransaction().commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

是否应该由应用程序层中DAO的调用者管理事务处理?

Tej*_*eni 16

通常,最佳做法是在服务层中管理不在DAO层中的事务.每个DAO方法通常处理一个特定操作,并且服务方法在一个事务中聚合它们.