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="实体所在的包"/>
不能仅仅停滞在实现上,应该去追求代价更小、性能更优的实现