Spring与Hibernate整合的相关问题和解决方案(整合方案一:dataSource交给Spring来管理)

整合的关键点:

  1. Hibernate的SessionFactory对象交给Spring去创建;
  2. Hibernate的事务交给Spring的声明式事务管理;(Hibernate的操作是基于事务的操作);
整合步骤:

  1.   配置数据源(采用C3P0连接池)

<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
<property name="initialPoolSize" value="3"></property>
<property name="maxPoolSize" value="10"></property>
<property name="maxStatements" value="100"></property>
<property name="acquireIncrement" value="2"></property>

        </bean>

  2.将SessionFactory的创建交给Spring来完成(SessionFactory的创建时由config.configure().buildSessionFactory()方法来获取的,故需要对hibernate.cfg.xml进行配置加载,而不是采用代码的形式进行加载)究其根源还是要获取数据库的连接来对数据库进行操作,所以要配置dataSoure属性的值;

<!-- 创建SessionFactory对象,, -->

<bean    id="sessionfactory" 

                     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

                  <!--  把hibernate配置文件注入给了LocalSessionFactoryBean,也可以把一个数据源dataSource注入给它)所以为了完成spring的依赖注入,Spring提供了LocalSessionFactoryBean这个类.从而创建SessionFactory对象 -->

      <property name="configLocation" value="hibernate.cfg.xml"></property>
      <property name="dataSource"  ref="datasource"></property>

    </bean>

      注:如果缺少datasource属性的配置,会产生如下错误:

Spring与Hibernate整合的相关问题和解决方案(整合方案一:dataSource交给Spring来管理)

                          

 3:配置事务管理器类、事务增强(拦截到方法后如何管理事务)、配置AOP管理

        <!-- 配置事务管理器类  用Hibernate技术连接时,事物管理器类为HibernateTransactionManager,且传入的参数为sessionFactory->

<bean id="tManager"                         class="org.springframework.orm.hibernate3.HibernateTransactionManager">

      <property name="sessionFactory" ref="sessionfactory"></property>
      <!-- <property name="dataSource" ref="datasource"></property> -->

      </bean>

    注:用JDBC技术连接时,事务管理器类为DataSourceTransactionManager;

<!--配置JdbcTemplate ,该类中维护了一个dataSource变量 -->
        <bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="datasource"></property>
        </bean>
       

           

      <!--配置事务增强  -->
      <tx:advice id="tx" transaction-manager="tManager">
      <tx:attributes>
      <tx:method name="save*" read-only="false"/>
      </tx:attributes>
      </tx:advice>
     
      <!-- 配置AOP -->
      <aop:config>
      <aop:pointcut expression="execution(* xzx.service.*.*(..))" id="pcut"/>
      <aop:advisor advice-ref="tx" pointcut-ref="pcut"/>
      </aop:config>



注意事项:在Spring和Hibernate整合时,session的获取建议用getCurrentSession();且不用在Hibernate.cfg.xml中进行配置以线程的方式获取session:<property name="hibernate.current_session_context_class">thread</property> 否则会报错。

Spring与Hibernate整合的相关问题和解决方案(整合方案一:dataSource交给Spring来管理)