站内搜索: 请输入搜索关键词

当前页面: 开发资料首页JSP 专题spring+Hibernate的几个小问题

spring+Hibernate的几个小问题

摘要: spring+Hibernate的几个小问题


一下问这么多问题,真不好意思,望大家帮忙
一.我在spring的applicationContext.xml中配置了org.apache.commons.dbcp.BasicDataSource来获得数据库连接池,使用mysql5.X,可是只有把其中datasource.defaultAutoCommit属性设置为true才能往数据库里写数据,为什么呢?如果datasource.defaultAutoCommit=true了,那我在spring中注册的事务代理还会起作用吗?还有在spring+Hibernate中使用dbcp,还需要编写释放连接归位到连接池代码吗?据说Hibernate3以后不建议使用dbcp了,那用哪种比较好呢,JNDI,dbcp,cm30哪种性能最优?
二.spring+Hibernate中通常见到会这么做,DAO层设计了一个DAO接口和一个实现类,却还设计了一个Service接口和实现类,Service实现类调用DAO中的方法,Service接口和DAO接口几乎一模一样,多这一步最主要的用意在哪?方便底层数据库的移植吗?
再次谢谢


第一个问题:spring注册的事务代理会起作用.如果你的应用服务器用weblogic,或webspere的话, 建议用jndi.
关于第二个问题:两个DAO可以用泛型来解决的,你可以看http://www.springside.org.cn/项目demo的源代码,挺不错的,我的blog也有一篇文章说这一个的.把数据访问层与业务层分开,通常业务不只是访问数据库的信息,这个时候,业务层的价值就体现出来了,我们项目在业务层加了agent一些算法的计算,如果没有业务层,直接放在控制层的话,会造成逻辑的混乱.


第二个通常是为了重用

如果什么都写在一层里,代码重用对这样的设计来说就是ctrl+c/v了

嘿嘿,虽然ctrl+c/v还是蛮好用的..- -~~


第一个问题:spring注册的事务代理会起作用
第二个问题:你的理解有错误,“DAO层设计了一个DAO接口和一个实现类,却还设计了一个Service接口和实现类,Service实现类调用DAO中的方法,Service接口和DAO接口几乎一模一样”其实不是这样的,service层是dao层之上的一个更高的对业务的抽象,采用spring进行事务代理通常也是对service层的函数进行的,给你举个例子,有2个dao对象,分别是
1 userDao(用户基本信息),里面有一个DeleteUserRecord函数(删除用户信息),
2 operateDao(操作记录),里面有一个DeleteOperateByUser函数(删除用户操作记录)
现在需要删除用户,同时也应该将该用户的所有操作记录删除,应该怎么做?
首先做一个service层,加一个函数DeleteUser
public void DeleteUser()
{
userDao.DeleteUserRecord();
operateDao.DeleteOperateByUser();
}
同时在spring中申明该函数的事务代理,这样才真正发挥了spring申明性事务的威力。
所以你现在应该明白为什么要加一个service层吧,dao层进行的是事务中的原子操作,而service层在一个事务中同时调用多个原子操作,至于为什么很多教程要将service层设计的和dao层一样,呵呵,我想他们可能是没有结合spring来理解这种分层结构的意义吧。


谢谢楼上几位朋友的回复,关于dao和service层的解释,PCSKiller(电脑杀手)朋友花了不少心思,我也完全明白了,再次表示感谢。
还有哪位可以说说,在spring+Hibernate中使用dbcp,还需要手动编写释放连接归位到连接池代码吗?不写的话会不会影响系统的性能?还有mysql是不是只有使用InnoDB才支持事务管理?


↑返回目录
前一篇: getParameter中文乱码问题
后一篇: jsp能不能单步调试呢?