举个例子:在一般情况下,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层接口的通用性!
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层接口的通用性!
解决方案 »
- ibatis 执行查询后连接不能自动关闭,不能自动回收
- hibernate_annotation不能运行
- 为什么listener启动失败!!
- 请问怎么做从数据库到内存的缓存?
- 请教关于JAVA编辑环境
- struts的问题,急啊!!! HTTP 404 - 未找到文件 !!!在线等
- 各位大侠谁知道我的idea为什么在开启tomcat之后,再编译文件,他不自动加载文件了呢
- 请问出现下面这个JDBC的问题试怎么回事呢?:将截断字符串或二进
- 怎么取得系统的当前时间,然后插入到SQL SERVER 中
- 大牛帮我看看这个错误吧~~(java.io.IOException: misplaced continuation line)
- 大三,想趁着这个暑假在武汉找个地方实习,希望各位前辈指点
- 如何找出系统中执行很慢的类
捕获异常然后throw 出去 用aop
在service层 try catch
DAO层就不用try catch了
拿aop的方式来说也就是那个切面表达式是指定在service包里面的*Service里面的所有方法的,这样配置的话,一个serivce里面的方法,
无论怎么调用dao的方法,
调用多少个不同dao的方法,
都会在一个事物里面完成的。而lz的事物是配在了dao层,
提到serivce层就行了。good luck
我也不想配在DAO层啊。但是事务是由session打开的。。
那既然如此,多要一个层模型岂不是多余的?
(dao的实现使用的是继承自spring的一个Ibatis的support类。)lz的例子可能是使用hibernate来管理dataSource之类的吧,
所以需要从hibernate来“生产”tx。我记得我的应用中,是直接由spring来管理dataSource的,
进而进行配置tx,设置到service层,注入到dao等等
所以才能让spring来灵活配置吧。lz 可以去google一下别的集成环境的配置,
看看和自己的有什么不同,
也许就能解决了。good luck
配置如下信息:
<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来说是粗粒度的)