举个例子:在一般情况下,Dao层代码是这样写的:
public class ServiceUserHibDao implements IServiceUserDao { public void delete(IServiceUser serviceUser) {
Session session = HibernateSessionFactory.getSession();
Transaction tx = null;
try {
// 开始一个事务
tx = session.beginTransaction();
// 执行事务
session.delete(serviceUser);
// 提交事务
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
// 如果出现异常,就撤销事务
if (tx != null)
tx.rollback();
} finally {
// 不管事务执行成功与否,最后都关闭Session
session.close();
}
}
}然后在Service层直接利用它的dao层对象的实例进行对应的方法调用。但是由此产生的许多问题如下:
1).如果我想批量(比如10个)删除用户的话,那我岂不是得在service循环调用dao层的delete函数? 或者我在dao层再添加个方法,实现在
一个事务之间内进行循环删除?第一种方式使得Session和Transaction各自分离,而第二种方式则是Service层和Dao层方法的简单映射,如果仅仅是简单映射,那Service层代码就基本是多余的.
2).如上Dao层代码编写,不方便异常的处理.异常应该在客户端程序员调用时根据情况进行异常判断。


请问,仅仅在使用Hibernate框架的时候,如何实现更好的Dao层和Service层,要求是方便事务的管理和异常的向上提交,以及需要考虑Dao层接口和Service层接口的通用性!

解决方案 »

  1.   

    dao不变Service extends baseService  
      

  2.   

    提供批量的方法
    捕获异常然后throw 出去 用aop
      

  3.   

    楼上说的对,用切面AOP.程序大了之后,用持久层控制事务会出现很多问题.不过spring的事务控制比较难.高并发比较复杂难处理 有好的方法记得给我邮件 [email protected]
      

  4.   

    自己写一个批量删除的方法
    在service层 try catch 
    DAO层就不用try catch了 
      

  5.   

    批量用存储过程 或者 statement.addBatch(String sql)  
      

  6.   

    事物处理是配置在service层的,
    拿aop的方式来说也就是那个切面表达式是指定在service包里面的*Service里面的所有方法的,这样配置的话,一个serivce里面的方法,
    无论怎么调用dao的方法,
    调用多少个不同dao的方法,
    都会在一个事物里面完成的。而lz的事物是配在了dao层,
    提到serivce层就行了。good luck
      

  7.   

    直接在dao层添加一个批量删除的方法  然后在service层进行调用就行了 至于异常的捕捉可以放到service层里 
      

  8.   


    我也不想配在DAO层啊。但是事务是由session打开的。。
      

  9.   

    如果service想要一个什么方法,都必须去dao层定义一个,那么,这岂不是只是做简单的方法映射?
    那既然如此,多要一个层模型岂不是多余的?
      

  10.   

    hibernate不熟,只能bd了。不过,我用的ibatis是可以用spring的配置来设置tx的。
    (dao的实现使用的是继承自spring的一个Ibatis的support类。)lz的例子可能是使用hibernate来管理dataSource之类的吧,
    所以需要从hibernate来“生产”tx。我记得我的应用中,是直接由spring来管理dataSource的,
    进而进行配置tx,设置到service层,注入到dao等等
    所以才能让spring来灵活配置吧。lz 可以去google一下别的集成环境的配置,
    看看和自己的有什么不同,
    也许就能解决了。good luck
      

  11.   

    使用spring与hibernate集成,Dao类可以继承HibernateDaoSupport类,这个类是spring 提供的,里面有getSession()方法,可以获得session,这样就不用你自己创建session了,但你要在spring的配置文件中
    配置如下信息:
    <bean name="userDao" class="com.user.dao.UserDaoImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
    </bean><bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="configLocation">
    <value>classpath:hibernate.cfg.xml</value>
    </property>
    </bean>
    具体的问题可以上网查一查!还有你的HibernateSessionFactory.getSession(),是每线程一个session吗?要不是每个线程一个session你连事务都无法保证完整运行,记得还要使用ThreadLocal存放session,否则你每个DAO中都要传递session这个参数来保证事务顺利执行,这样会比较麻烦!
    事务这东东最好不要写在DAO中,建议把事务写在service中(spring声明式事务就可以不用写了),然后在service中调用你写的一些DAO中的方法(service相对DAO来说是粗粒度的)