Spring整合Hibernate

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
*/

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。