正确实现dao类来管理事务

jim*_*ner 2 java dao hibernate transactions

我正在研究一个通过hibernate调用数据库后端的java Web应用程序.我使用servlets,jsp和tomcat进行测试/部署.大多数java-ee书籍建议使用Dao类进行数据库调用.根据书中给出的示例(Hibernate Recipes)作者:Gary Mak),我创建了一个通用基类和一个特定的子类,如下所示.

class BaseDao{
   private Class persistentClass;
   public BaseDao(Class persistentClass) {
        super();
        this.persistentClass = persistentClass;
    }
   public Object findById(Long id) {
        SessionFactory factory = HibernateUtil.getSessionFactory();
        Session session = factory.openSession();
        Object object = null;
        try {
            object = (Object) session.get(persistentClass, id);
            return object;
        }
        finally {
            session.close();
        }
    }

    @Override
    public void saveOrUpdate(Object obj) {
        SessionFactory factory = HibernateUtil.getSessionFactory();
        Session session = factory.openSession();
        Transaction tx = null;
        try {
        tx = session.beginTransaction();
        session.saveOrUpdate(obj);          
        tx.commit();
        }catch(HibernateException e){
            if (tx != null) {
                       tx.rollback();   

             }
             throw e;
        }finally {
            session.close();
        }

    }
}

    class SaleOrderDao extends BaseDao{
        public SaleOrderDao() {
            super(SaleOrder.class);
        }
        @Override
       public SaleOrder findSaleOrderById(Long saleOrderId){            
                SaleOrder so =  (SaleOrder)findById(saleOrderId);
                return  so;

        }
        @Override
        public void saveOrUpdateSaleOrder(SaleOrder so){

                    saveOrUpdate( so);

            }

    }
Run Code Online (Sandbox Code Playgroud)

在浏览本论坛的帖子时,我遇到了Ryan Stewart的 建议,建议不要在dao方法中开始和结束事务.当然,我的项目不使用任何支持事务管理的Web框架.我只限于使用jsp,servlet和servlet容器..

有没有什么方法可以重写我的dao实现,以便可以正确管理事务......我从这些书中找不到任何关于我读过的书.

希望有人帮我提出建议

真诚,

吉姆

Boz*_*zho 9

通常不应在DAO中处理事务.它们应该由服务层处理.一种服务方法可以包括全部在同一事务中的多个DAO调用.

Spring(以及其他DI框架)允许您通过简单地注释您的服务方法来实现@Transactional.没有弹簧,您仍然可以在服务层手动执行此操作