Spring与Hibernate整合的相关问题和解决方案(整合方案一:dataSource交给Spring来管理)
整合的关键点:
- Hibernate的SessionFactory对象交给Spring去创建;
- Hibernate的事务交给Spring的声明式事务管理;(Hibernate的操作是基于事务的操作);
整合步骤:
- 配置数据源(采用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属性的配置,会产生如下错误:
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> 否则会报错。