天天看点

在applicationContext.xml文件中配置SessionFactory和dataSource的bean

在所有的ORM框架中,Spring对Hibernate的支持最好. Spring提供很多IOC特性的支持,方便处理大部分典型的Hibernate整合问题,如:sessionFactory注入,HibernateTemplate的简化操作,及DAO支持等. applicationContext.xml文件包含如下部分内容:

<bean id="myDataSource"
		class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url"
			value="jdbc:mysql://localhost:3306/tenancybj" />
		<property name="username" value="root" />
		<property name="password" value="12345" />
	</bean>           
<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource" ref="myDataSource" />
		<!--  注释原因:hibernate.cfg.xml  里面已经存在   -->
		<!--  取消注释原因:查询时使用了  from ***  hql语句    -->
		<property name="mappingResources">
			<list>
				<value>domain/UserInfo.hbm.xml</value>
				<value>domain/Customer.hbm.xml</value>
				<value>domain/SupplyMan.hbm.xml</value>
				<value>domain/ProType.hbm.xml</value>
				<value>domain/ProductParam.hbm.xml</value>
				<value>domain/StorageRate.hbm.xml</value>
				<value>domain/HireRec.hbm.xml</value>
				<value>domain/RepairRec.hbm.xml</value>
				<value>domain/SalesRec.hbm.xml</value>
			</list>
		</property>

		<property name="hibernateProperties">
			<value>
				hibernate.dialect=org.hibernate.dialect.MySQLDialect
			</value>
		</property>

	</bean>           

SessionFactory由ApplicationContext管理,并随着应用启动时自动加载,可以被处于ApplicationContext管理的任意一个Bean引用,比如DAO. Spring采用依赖注入为DAO对象注入SessionFactory的引用;   Hibernate持久层访问步骤: 1 创建Configuration实例 2 创建SessionFactory实例 3 创建Session实例 4 打开事务 5 开始持久化访问 6 提交事务 7 遇到异常,回滚事务 8 关闭Session   Spring提供更简单的方式操作持久层,无须显式地打开Session,也无须在代码中执行任何事务操作语句. Spring提供HibernateTemplate,用于持久层访问.   HibernateTemplate无须显式打开Session及关闭Session,它只要获得SessionFactory的引用,将可以智能打开Session,并在持久化访问结束后关闭Session,程序开发只需完成持久层逻辑,通用的操作则由HibernateTemplate完成   在DAO层的实现类中作如下操作:

private HibernateTemplate ht;
    private SessionFactory sessionFactory;
public void save(Person person) {
setHibernateTemplate();
ht.save(person);
System.out.println("saved");
}
public void setHibernateTemplate() {
if(ht==null)
ht = new HibernateTemplate(sessionFactory);

}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
           

解释:定义sessionFactory,这里的实现类就不能实现HibernateDaoSupport了,因为它里面提供了sessionFactory 和HibernateTemplate的final的方法定义,就不能在子类中覆盖了。 更好的实现方式就是:继承HibernateDaoSupport。