Spring集成Hibernate 《Srping in action》阅读笔记
一,使用Hibernate模板
与hibernate进行交互的接口是org.hibernate.Session。这个Session接口提供了基本的数据访问功能,比如从数据库保存、更新、删除和加载对象。
获得Hibernate Session对象应用的标准方式是实现Hibernate的sSessionFactory接口。SessionFactory负责打开、关闭和管理Hibernate Session,以及其它一些功能。
Spring的HibernateTemplate在Hibernate Session之上提供了一个抽象层,其主要功能是简化打开和关闭Hibernate会话,并且把Hibernate的特定异常转化为Spring ORM异常之一。
典型的Hibernate映射文件:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResource">
<list>
<value>com/rason/Rant.hbm.xml</value>
<value>com/rason/Motorist.hbm.xml</value>
<value>com/rason/Vehicle.hbm.xml</value>
</list>
</property>
<property>
<props>
<prop key="hibernate.dialect" >${hibernate.dialect}</prop>
</props>
</property>
</bean>
建立基于Hibernate的DAO:
spring提供了HibernateDaoSupport,它能够让我们把会话工厂Bean直接装配到DAO类,会创建一个HibernateTemplate供DAO使用,如图:
public class HibernateRantDao extends HibernateDaoSupport implements RantDao{....}
使用getHibernateTemplate()获得HibernateTemplate:
public void saveMotorist(Motorist motorist){
getHibernateTemplate().saveOrUpdate(motorist);
}
<bean id="rantDao" class="com.rason.dao.hibernate.HibernateRantDao">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
上述方法扩展了一个spring特定的类,有些人不认为这是个问题,但有些人会认为是spring对其代码的一种入侵。下面利用hibernate3对上下文会话的支持从DAO里去除对特定spring的依赖。
二,使用hibernate3上下文会话
解耦版本的HibernateRantDao
public class HibernateRantDao extends HibernateDaoSupport implements RantDao{
....
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory){
this.sessionFactory=sessionFactory;
}
}
使用hibernate3上下文会写编写saveRant()方法:
public void saveRant(Rant rant){
sessionFactory.getCurrentSession().saveOrUpdate(rant);
}