Spring整合Hibernate
1到底整合什么?
I:为了让Spring的IOC容器去生成SessionFactory
II:为了让Hibernate能使用Spring的声明式事务
2如何整合(整合步骤)
1加入Hibernate的必须jar包,然后再加入commons-logging-1.1.3.jar,和Mysql的jar包mysql-connector-java-5.1.7-bin.jar
2配置Hibernate配置文件(数据源的配置不用在这里配置了,连接数据库参数也不用在这里配置了,在这个文件配置数据库方言、生成表策略等、、、、)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 配置 hibernate 的基本属性 --> <!-- 1. 数据源需配置到 IOC 容器中, 所以在此处不再需要配置数据源 --> <!-- 2. 关联的 .hbm.xml 也在 IOC 容器配置 SessionFactory 实例时在进行配置 --> <!-- 3. 配置 hibernate 的基本属性: 方言, SQL 显示及格式化, 生成数据表的策略以及二级缓存等. --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 配置 hibernate 二级缓存相关的属性. --> </session-factory> </hibernate-configuration>
3在Spring的配置文件配置数据源(例如Spring中配置C3p0那样,数据源也是一个Bean,所以也用Bean节点来配置)
<!-- 配置数据源 --> <!-- 加载数据源文件 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置数据源属性 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> </bean>
4在Spring配置文件中配置SessionFactory
(1告诉SessionFactory使用哪个数据源吧,
2告诉SessionFactory hibernate.cfg.xml文件在哪里
3告诉Sessionfactory 持久化类的映射文件在哪里(能同一放在一个位置??))
<!-- 配置sessionFactory:通过 Spring 提供的 LocalSessionFactoryBean 进行配置 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!-- 使用哪一个数据源 --> <property name="dataSource" ref="dataSource"></property> <!-- 配置 hibernate 配置文件的位置及名称,就是生成SessionFactory时的约束 --> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <!-- 告诉SessionFactory持久化类的配置文件在哪里 --> <property name="mappingLocations" value="classpath:com/atguigu/spring/hibernate/entities/*.hbm.xml"></property> </bean>
5代码实现(就是到底怎么用呢)
/* * 1首先要获取SessionFactory吧,这个直接在IOC拿即可,使用Autowire注解关联,这样会自动加载SessionFactory实例 * 2要获取Session吧,但是Session还是用OpenSession方法??不是,这里应该使用线程Session, * 因为如果是opensession会导致产生了很多Session,会造成内存溢出和对象滥用 * 3以前的Session是和Hibernate的事务(绑定在一起的),但是既然我们整合到 了Spring,那就应该使用Spring的声明式事务吧 * 所以要记得调用Session对象的方法里,都应该绑定事务,要不然会报错 */ @Autowired private SessionFactory sessionFactory;--取得SessionFactory
public Session getSession() { --取得Session return sessionFactory.getCurrentSession(); }
* Spring hibernate 事务的流程
* 1. 在方法开始之前
* ①. 获取 Session
* ②. 把 Session 和当前线程绑定, 这样就可以在 Dao 中使用 SessionFactory 的
* getCurrentSession() 方法来获取 Session 了
* ③. 开启事务
*
* 2. 若方法正常结束, 即没有出现异常, 则
* ①. 提交事务
* ②. 使和当前线程绑定的 Session 解除绑定
* ③. 关闭 Session
*
* 3. 若方法出现异常, 则:
* ①. 回滚事务
* ②. 使和当前线程绑定的 Session 解除绑定
* ③. 关闭 Session
*/