为什么要用Hibernate框架?这个在《Hibernate介绍》博客中已经提到了
既然用Hibernate框架访问管理持久层那为何又提到用Spring来管理以及整合Hibernate呢?
首先我们来看一下Hibernate进行操作的步骤比如添加用户的一个步骤在此为了解释提出的问题只做一个截图若想看完整代码示例可以参考《八步详解Hibernate的搭建及使用》
看截图可以看出Hibernate操作的步骤如下
获得Configuration对象
创建SessionFactory
创建Session
打开事务
进行持久化操作比如上面的添加用户操作
提交事务
发生异常回滚事务
关闭事务
使用Hibernate进行访问持久层每次都要进行这八个步骤但是若使用Spring对Hibernate进行管理又是怎么样的呢?
首先Spring对Hibernate提供了HibernateTemple类这个模版类对session进行封装并且Spring会默认为自动提交事务所在在dao层直接写入thissave(Object)即可
在实践中遇到了一个问题无法插入数据库经过一番折腾多次实验验证总结一下原因结果如下
注意所有的操作都必须在事务中进行若单纯的使用Hibernate则事务需要手动开启提交关闭操作当然也可以在Hibernate配置文件中自动提交
若使用Spring管理Hibernate则默认的是自动提交事务但是在此需要注意的是若使用Spring在配置文件中配置数据源而不使用hibernatecfgxml则可以成功插入数据库因为HibernateTemple默认提供自动提交事务在Spring的配置文件配置数据源如下使用此数据源需要的jar如下commonsdbcpjarcommonspooljarmsbasejarmssqlserverjar msutiljarsqljdbcjar;
<bean id=dataSource class=monsdbcpBasicDataSource>
<property name=driverClassName value=commicrosoftjdbcsqlserverSQLServerDriver>
</property>
<property name=url value=jdbc:sqlserver://:;database=test></property>
<property name=username value=sa></property> <property name=password value=></property>
</bean>
<bean id=sessionFactory class=orgspringframeworkormhibernateLocalSessionFactoryBean>
<property name=dataSource ref=dataSource></property>
<! hibernate属性配置 >
<property name=hibernateProperties>
<props>
<prop key=hibernatedialect>orghibernatedialectSQLServerDialect</prop>
<prop key=hibernatehbmddlauto>update</prop>
</props>
</property>
! 如果采用传统的hbmxml的方式可以采用如下方式来简化注册hbmxml的步骤并且class为LocalSessionFactoryBean >
<property name=mappingLocations>
<list>
<value>classpath:Userhbmxml</value>
</list>
</property>
</bean>
若Spring中不是直接配置数据源而是使用hibernatecfgxml则是无法若直接thissave(Object)则无法插入数据库中但是可以保存中缓存中因为所有的操作都是在事务中执行的而hibernatecfgxml数据源则默认是不是自动提交的解决的办法如下可以在hibernatecfgxml中填写
<property name=nnectionautocommit>true</property>
以下Spring使用hibernatecfgxml数据源
<bean id=sessionFactory class=orgspringframeworkormhibernateLocalSessionFactoryBean>
<property name=configLocation>
<value>classpath:hibernatecfgxml</value>
</property>
<property name=mappingLocations>
<list>
<value>classpath:Userhbmxml</value>
</list>
</property>
</bean>
以上介绍了Spring来管理Hibernate的好处在于不用手动创建SessionFactorySession不用手动开启提交关闭事务这一切完全都是由Spring来管理并且Spring还提供了HibernateTemple的工具使一切操作简单方便
dao层在Spring配置文件中配置如下
《span >bean id=userDao class=comUserDaoUserDaoImpl>
<property name=sessionFactory ref=sessionFactory></property>
</bean></span>
则在dao层的代码如下
package comUserDao;
import orgspringframeworkormhibernateHibernateTemplate;
import comuserUser;
public class UserDaoImpl extends HibernateTemplate implements UserDao {
@Override
public void insert(User user) {
thissave(user)
}
}
这只是其中的关键的代码至于完整的小demo已经上传
正如上述所说一切操作尽在事务中事务这个概念想必大家不陌生吧一般情况事务应该在业务逻辑层而不是在dao层应用并且Spring对事务有很好的封装自己有一套事务管理的封装使业务逻辑与事务管理分离进一步达到解耦作用下一篇博客我们继续会讲解Spring管理Hibernate中的事务管理