Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正确实现dao类以管理事务_Java_Hibernate_Transactions_Dao - Fatal编程技术网

Java 正确实现dao类以管理事务

Java 正确实现dao类以管理事务,java,hibernate,transactions,dao,Java,Hibernate,Transactions,Dao,我正在开发一个通过hibernate调用数据库后端的java web应用程序。我使用servlet、jsp和tomcat进行测试/部署。大多数关于java ee的书籍建议使用Dao类进行数据库调用。根据书籍中给出的示例(Gary Mak的hibernate Recipes),我创建了一个泛型基类和一个特定的子类,如下所示 class BaseDao{ private Class persistentClass; public BaseDao(Class persistentClass

我正在开发一个通过hibernate调用数据库后端的java web应用程序。我使用servlet、jsp和tomcat进行测试/部署。大多数关于java ee的书籍建议使用Dao类进行数据库调用。根据书籍中给出的示例(Gary Mak的hibernate Recipes),我创建了一个泛型基类和一个特定的子类,如下所示

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);

            }

    }
在浏览本论坛的帖子时,我遇到了Ryan Stewart的,即不建议使用dao方法开始和结束事务。遗憾的是,我的项目没有使用任何支持事务管理的web框架。我仅限于使用jsp、servlet和servlet容器

有没有什么方法可以重写我的dao实现,从而使事务能够得到正确的管理..从我读的那些书中,我找不到这方面的任何东西

希望有人能帮我提建议

真诚地


Jim

通常不应在DAO中处理事务。它们应该由服务层处理。一个服务方法可能包括多个DAO调用,这些调用都在同一事务中


Spring(以及其他DI框架)允许您通过使用
@Transactional
简单地注释您的服务方法来实现这一点。如果没有spring,您仍然可以在服务层中手动执行此操作

使用spring并完成此操作。否则,您就忽略了一个现成的解决方案,该解决方案是免费提供的、经过测试的,并且有很好的文档记录,而倾向于花时间拼凑一些未经测试和未记录的东西。撇开不谈,你明白什么是交易吗?我不是想屈尊俯就,但这一点很重要,特别是如果你打算自己动手的话。Wikipedia的描述冗长但准确:简而言之:txn是一个或多个必须全部通过或回滚的db查询。考虑一下银行把妈妈从一个账户转到另一个账户。一项必须记入借方,另一项必须记入贷方。如果一个账户被借记,但贷记失败,你就把钱汇进了“空白”账户。我有一个问题。对于3种不同的mysql模式,我有3个DAO类。它们都有不同的数据源、会话工厂和事务管理器。我需要在一个事务下更新所有3个模式的表。这些dao调用来自一个服务方法。我无法找到如何为该服务方法提供所有3个事务管理器。我正在使用spring和hibernate。有什么想法吗?这值得一个单独的问题谢谢波佐。它将作为一个单独的问题发布。