Spring与Hibernate整合

一 概述

1.整合目的

在Hibernate中,SessionFactory是一个重量级对象,创建与初始化会耗费大量的资源,应该减少对象的创建次数,并且SessionFactory线程安全,可以采用单例模式,如果将对象的创建任务交给Spring容器就解决了这个问题。

二 实现

1.配置SessionFactory创建类

Spring提供了LocalSessionFactoryBean负责创建SessionFactory对象:

<bean id="sessionFactory"class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="c3p0" />
    <property name="hibernateProperties">
       <props>
           <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
           <prop key="hibernate.show_sql">true</prop>
           <prop key="hibernate.format_sql">true</prop>
           <prop key="hibernate.hbm2ddl.auto">update</prop>
           <prop key="hibernate.current_session_context_class">
org.springframework.orm.hibernate5.SpringSessionContext</prop> </props> </property> <property name="mappingDirectoryLocations" value="com/spring_hibernate/integration/demo01" /> </bean>
  • mappingDirectoryLocations:配置映射文件,只需要指明映射文件的根路径即可,系统会自动加载此路径下的映射文件。
  • current_session_context_class:用来指定Session对象所处的上下文环境,即Session的创建者,Spring与Hibernate整合以后,Session对象就由Spring容器创建与管理。

2.配置事务管理器

Spring为兼容Hibernate提供的事务管理器为HibernateTransactionManager:

<bean id="transactionManager"class="org.springframework.orm.hibernate5.HibernateTransactionManager">
      <property name="sessionFactory" ref="sessionFactory" />
</bean>

Spring为不同的操作数据库的方式提供了不同的数据源,JDBC与Mybatis共享DataSourceTransactionManager。

3.配置事务

Spring提供了两种事务,一种基于Spring自身AOP的事务,一种基于AspectJ的事务,由于后者比前者简单方便,采用后者为Dao服务层配置事务:

<tx:advice id="advice" transaction-manager="transactionManager">
   <tx:attributes>
      <tx:method name="find*" isolation="DEFAULT" propagation="REQUIRED"read-only="true" />
      <tx:method name="modify*" isolation="DEFAULT" propagation="REQUIRED"rollback-for="exception" />
      <tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED"rollback-for="exception" />
      <tx:method name="remove*" isolation="DEFAULT" propagation="REQUIRED"rollback-for="exception" />
   </tx:attributes>
</tx:advice>
<aop:config>
   <aop:pointcut id="p01" expression="execution(* *..demo01.*.*(..))" />
   <aop:advisor advice-ref="advice" pointcut-ref="p01" />
</aop:config>

三 注解

当Hibernate的实体类采用注解注册时,映射文件被取代,因此需要在Spring配置文件中修改映射关系的设定方式,修改为:

<property name="packagesToScan"value="实体所在的包"/>
posted @ 2017-07-24 21:24  tonghun  阅读(650)  评论(0编辑  收藏  举报