8.2.1 如何集成
Spring通过使用如下Bean进行集成Hibernate:
- LocalSessionFactoryBean :用于支持XML映射定义读取:
configLocation和configLocations:用于定义Hibernate配置文件位置,一般使用如classpath:hibernate.cfg.xml形式指定;
mappingLocations :用于指定Hibenate映射文件位置,如chapter8/hbm/user.hbm.xml;
hibernateProperties:用于定义Hibernate属性,即Hibernate配置文件中的属性;
dataSource:定义数据源;
hibernateProperties、dataSource用于消除Hibernate配置文件,因此如果使用configLocations指定配置文件,就不要设置这两个属性了,否则会产生重复配置。推荐使用dataSource来指定数据源,而使用hibernateProperties指定Hibernate属性。
- AnnotationSessionFactoryBean:用于支持注解风格映射定义读取,该类继承LocalSessionFactoryBean并额外提供自动查找注解风格配置模型的能力:
annotatedClasses:设置注解了模型类,通过注解指定映射元数据。
packagesToScan:通过扫描指定的包获取注解模型类,而不是手工指定,如“cn.javass.**.model”将扫描cn.javass包及子包下的model包下的所有注解模型类。
接下来学习一下Spring如何集成Hibernate吧:
1、准备jar包:
首先准备Spring对ORM框架支持的jar包:
org.springframework.orm-3.0.5.RELEASE.jar //提供对ORM框架集成 |
下载hibernate-distribution-3.6.0.Final包,获取如下Hibernate需要的jar包:
|
下载slf4j-1.6.1.zip(http://www.slf4j.org/download.html),slf4j是日志系统门面(Simple Logging Facade for Java),用于对各种日志框架提供给一致的日志访问接口,从而能随时替换日志框架(如log4j、java.util.logging):
slf4j-api-1.6.1.jar //核心API slf4j-log4j12-1.6.1.jar //log4j实现 |
将这些jar包添加到类路径中。
2、对象模型UserModel:
package com.domain;
public class UserModel {
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getMyName() {
return myName;
}
public void setMyName(String myName) {
this.myName = myName;
}
private int id;
private String myName;
//省略getter和setter
}
3、Hibernate映射定义
<hibernate-mapping>
<class name="com.domain.UserModel" table="t_person">
<id name="id" column="id"><generator class="native"/></id>
<property name="myName" column="name"/>
</class>
</hibernate-mapping>
4 定义sessionFactory配置文件
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${driverClass}"/>
<property name="jdbcUrl" value="${jdbcUrl}"/>
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
<!--initialSize: 初始化连接-->
<property name="initialPoolSize" value="5"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/> <!-- 指定数据源 -->
<property name="mappingResources"> <!-- 指定映射定义 -->
<list>
<value>com/domain/user.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties"> <!--指定Hibernate属性 -->
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
</bean>
<bean id="userHibernateDao" class="com.hibernate.UserHibernateDaoImpl" >
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
5 类似于JdbcDaoSupport类,Spring对Hibernate也提供了HibernateDaoSupport类来支持一致的数据库访问。HibernateDaoSupport也是DaoSupport实现:
package com.hibernate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.dao.IUserDao;
import com.domain.UserModel;
public class UserHibernateDaoImpl extends HibernateDaoSupport implements IUserDao {
private static final String COUNT_ALL_HQL = "select count(*) from UserModel";
@Override
public void save(UserModel model) {
getHibernateTemplate().save(model);
}
@Override
public int countAll() {
Number count = (Number) getHibernateTemplate().find(COUNT_ALL_HQL).get(0);
return count.intValue();
}
}
6测试
public void testHibernateTemplate() {
String[] configLocations = new String[] { "classpath:applicationContext.xml" };
ApplicationContext ctx = new ClassPathXmlApplicationContext(configLocations);
IUserDao userDao =(IUserDao)ctx.getBean("userHibernateDao");
UserModel model = new UserModel();
model.setMyName("hibernate");
userDao.save(model);
System.out.println(userDao.countAll());
}