Spring 框架提供了对 Hibernate、JDO 和 iBATIS SQL Maps 的集成支持。Spring 对 Hibernate 的支持是第一级的,整合了许多 IOC 的方便特性,解决了许多典型的 Hibernate 集成问题。框架对 Hibernate 的支持符合 Spring 通用的事务和数据访问对象(DAO)异常层次结构。

1、配置datasource

现在常用的开源数据连接池主要有c3p0、dbcp和proxool三种,其中:hibernate开发组推荐使用c3p0;spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect ,告诉连接被重置,这个设置可以解决);hibernate in action推荐使用c3p0和proxool。

使用dbcp的配置片段例子:

1     <bean id="exampleDataSource" class="org.apache.commons.dbcp.BasicDataSource">
2         <property name="driverClassName" value="com.mysql.jdbc.Driver" />
3         <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />
4         <property name="username" value="root" />
5         <property name="password" value="" />
6         <property name="initialSize" value="5" />
7         <property name="maxActive" value="10" />
8     </bean>

使用proxool的配置片段例子:

 1     <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
 2         <property name="alias" value="proxoolDataSource"/>
 3         <property name="driver" value="com.mysql.jdbc.Driver" />
 4         <property name="driverUrl" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />
 5         <property name="user" value="root" />
 6         <property name="password" value="" />
 7         <property name="statistics" value="1m,15m,1h,1d" />
 8         <property name="maximumConnectionCount" value="40"/>
 9         <property name="minimumConnectionCount" value="5"/>
10         <property name="simultaneousBuildThrottle" value="30"/>
11     </bean>

读配置文件的方式引用属性:

1     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
2         <property name="location" value="/WEB-INF/jdbc.properties"/>
3     </bean>
4     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
5         <property name="driverClassName" value="${jdbc.driverClassName}"/>
6         <property name="url" value="${jdbc.url}"/>
7         <property name="username" value="${jdbc.username}"/>
8         <property name="password" value="${jdbc.password}"/>
9     </bean>

配置文件“jdbc.properties”内容为:

jdbc.driverClassName= com.mysql.jdbc.Driver
jdbc.url= jdbc:mysql://localhost:3309/sampledb
jdbc.username=root
jdbc.password=1234 

2、配置sessionFactory

使用Hibernate的主要接口是org.hibernate.Session。Session接口提供了基本的CRUD数据访问功能,获取Hibernate Session是通过Hibernate的SessionFactory接口,负责Session的打开、管理和关闭。Spring提供了Hibernate Session工厂Bean来获取Hibernate的SessionFactory。

如果使用XML文件配置持久化域的对象,那么需要使用Spring提供的LocalSessionFactoryBean:

 1     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
 2         <property name="dataSource" ref="dataSource"/>
 3         <property name="mappingDirectoryLocations">
 4             <list>
 5                 <value>classpath:com/demo/model/mappings</value>
 6             </list>
 7         </property>
 8         <property name="hibernateProperties">
 9             <props>
10                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
11             </props>
12         </property>
13     </bean>

如果使用Annotation注解方式来定义持久化,那么需要使用AnnotationSessionFactoryBean:

1     <bean id="sessionFactory" class="org.springframework.orm.hibernate4.annotation.AnnotationSessionFactoryBean">
2         <property name="dataSource" value="dataSource" />
3         <property name="packageToScan" value="com.habuma.spitter.domain" />
4         <property name="hibernateProperties">
5             <props>
6                 <prop key="dialect">org.hibernate.dialect.MySQL5Dialect</prop>
7             </props>
8         </property>
9     </bean>

声明了sessionFactory后,在DAO中可以使用@Autowired和@Qualifier("sessionFactory")注入属性访问sessionFactory。

Hibernate3之后,引入了上下文session,以保证每个事物使用同一session。Hibernate的SessionFactory提供获取session的方法是getCurrentSession (获得与当前线程绑定的session)。内部通过代理封装,此方式得到的session不仅和当前线程绑定,也无需手动开关。默认在事务提交之后,session自动关闭。引入Spring之后,sessionfactory的创建等都交给Spring管理,用户可以不再考虑session的管理,事务的开启关闭,只需配置事务即可。

另外在Web应用中,session关闭后,因延迟加载导致前台无法显示的问题以往解决方式为强制全部加载,现在也可通过在web.xml中配OpenSessionInViewFilter来解决。如果担心OpenSessionInViewFilter会使系统出现数据库资源的性能瓶颈,则要设计好Service层的服务接口,使延迟加载在Service层内完成。

当Session出现异常时,如果需要Spring自动回滚事务,必须使异常以Spring非检查型异常的形式重新抛出。这需要在Spring应用上下文中添加一个Bean:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

 3、配置Hibernate事务

Spring并不直接管理事物,而是提供了多种事物管理器,它们将事务管理的职责委托给JTA或其他持久化机制所提供的平台相关的事务实现。如果程序的持久化通过Hibernate实现,那么需要使用HibernateTransactionManager,需要在Spring上下文定义中添加如下的<bean>声明,sessionFactory属性需要装配Hibernate SessionFactory。Spring提供了一个tx配置命名空间,借助它可以简化Spring中的声明式事务。:

 1 <beans xmlns="http://www.springframework.org/schema/beans"
 2   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3   xmlns:aop="http://www.springframework.org/schema/aop"
 4   xmlns:tx="http://www.springframework.org/schema/tx"
 5   xsi:schemaLocation="
 6   http://www.springframework.org/schema/beans
 7   http://www.springframework.org/schema/beans/spring-beans.xsd
 8   http://www.springframework.org/schema/tx
 9   http://www.springframework.org/schema/tx/spring-tx.xsd
10   http://www.springframework.org/schema/aop
11   http://www.springframework.org/schema/aop/spring-aop.xsd">
12
13 <!-- 声明事务管理器开始 -->
14     <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
15         <property name="sessionFactory" ref="sessionFactory"/>
16     </bean>
17 <!-- 声明事务 -->
18     <tx:advice id="txAdvice" transaction-manager="txManager">
19         <tx:attributes>
20             <tx:method name="save*" propagation="REQUIRED" />
21             <tx:method name="update*" propagation="REQUIRED" />
22             <tx:method name="merge*" propagation="REQUIRED" />
23             <tx:method name="delete*" propagation="REQUIRED" />
24             <tx:method name="enable*" propagation="REQUIRED" />
25             <tx:method name="disable*" propagation="REQUIRED" />
26             <tx:method name="get*" propagation="REQUIRED" read-only="true" />
27             <tx:method name="count*" propagation="REQUIRED" read-only="true" />
28             <tx:method name="find*" propagation="REQUIRED" read-only="true" />
29             <tx:method name="list*" propagation="REQUIRED" read-only="true" />
30             <tx:method name="*" propagation="REQUIRED" read-only="true" />
31         </tx:attributes>
32     </tx:advice> 

其中,<tx:method>有多个属性,propagation="REQUIRED”表示该方法需要事务,read-only="true”指定该方法事务为只读。

声明完毕事务之后,就可以通过Spring的AOP技术将配置好的事务织入Service方法中去:

1     <aop:config>
2         <!-- 通过aop定义事务增强切面 -->
3         <aop:pointcut id="txPointcut" expression="execution(* com.infrastructure.project.base.service..*.*(..))" />
4         <!-- 引用事务增强 -->
5         <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
6     </aop:config>

如果使用注解配置声明式事务,即通过@Transactional对需要事务增强的Bean接口实现类或方法进行标注,则需要在Spring容器中配置基于注解的事务增强驱动:

1 <tx:annotation-driven transaction-manager="txManager"/>

然后即可在Service中使用@Transactional注解声明事务:

1 @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
2 public class SpitterServiceImpl implements SpitterService{
3     ...
4     @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
5     public void addSpitter(Spitter spitter){
6         ...
7     }
8     ...
9 }

4、将以上整合,典型的配置文件如下:

 1 <beans xmlns="http://www.springframework.org/schema/beans"
 2        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3        xmlns:aop="http://www.springframework.org/schema/aop"
 4        xmlns:tx="http://www.springframework.org/schema/tx"
 5        xsi:schemaLocation="
 6   http://www.springframework.org/schema/beans
 7   http://www.springframework.org/schema/beans/spring-beans.xsd
 8   http://www.springframework.org/schema/tx
 9   http://www.springframework.org/schema/tx/spring-tx.xsd
10   http://www.springframework.org/schema/aop
11   http://www.springframework.org/schema/aop/spring-aop.xsd">
12
13 <!-- 配置dataSource -->
14 <bean id="exampleDataSource" class="org.apache.commons.dbcp.BasicDataSource">
15     <property name="driverClassName" value="com.mysql.jdbc.Driver" />
16     <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&amp;characterEncoding=UTF-8" />
17     <property name="username" value="root" />
18     <property name="password" value="" />
19     <property name="initialSize" value="5" />
20     <property name="maxActive" value="10" />
21 </bean>
22
23 <!-- 声明sessionFactory -->
24 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
25     <property name="dataSource" ref="dataSource"/>
26     <property name="mappingDirectoryLocations">
27         <list>
28             <value>classpath:com/demo/model/mappings</value>
29         </list>
30     </property>
31     <property name="hibernateProperties">
32         <props>
33             <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
34         </props>
35     </property>
36 </bean>
37
38 <!-- 声明事务管理器开始 -->
39 <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
40     <property name="sessionFactory" ref="sessionFactory"/>
41 </bean>
42
43 <!-- 声明事务 -->
44 <tx:advice id="txAdvice" transaction-manager="txManager">
45     <tx:attributes>
46         <tx:method name="save*" propagation="REQUIRED" />
47         <tx:method name="update*" propagation="REQUIRED" />
48         <tx:method name="merge*" propagation="REQUIRED" />
49         <tx:method name="delete*" propagation="REQUIRED" />
50         <tx:method name="enable*" propagation="REQUIRED" />
51         <tx:method name="disable*" propagation="REQUIRED" />
52         <tx:method name="get*" propagation="REQUIRED" read-only="true" />
53         <tx:method name="count*" propagation="REQUIRED" read-only="true" />
54         <tx:method name="find*" propagation="REQUIRED" read-only="true" />
55         <tx:method name="list*" propagation="REQUIRED" read-only="true" />
56         <tx:method name="*" propagation="REQUIRED" read-only="true" />
57     </tx:attributes>
58 </tx:advice>
59
60 <!-- 织入事务 -->
61 <aop:config>
62     <aop:pointcut id="txPointcut" expression="execution(* com.infrastructure.project.base.service..*.*(..))" />
63     <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
64 </aop:config>

转载于:https://www.cnblogs.com/afeng7882999/p/4297908.html

Spring+Hibernate的典型配置相关推荐

  1. firebird——Spring hibernate 集成连接配置

    -Djava.library.path=.\lib\ firebird版本是2.5, 嵌入式类库是2.2 这些都可以从官网中下载. 我用的是netbeans,在java 项目中新建一个lib文件夹,把 ...

  2. spring+hibernate+mysql mvc 配置

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-// ...

  3. Spring MVC+Spring +Hibernate配置事务,但是事务不起作用

    最近做项目,被一个问题烦恼了很久.使用Spring MVC+Spring +Hibernate开发项目,在使用注解配置事务管理,刚开始发现无论如何数据库都无法更新,但是可以从数据库查询到数据.怀疑是配 ...

  4. Spring+Hibernate+c3p0连接池配置-连接无法释放的问题解决方案

     1.Spring+Hibernate+c3p0连接池配置: <?xml version="1.0" encoding="UTF-8"?> < ...

  5. Spring+Hibernate配置多数据源

    Spring+Hibernate配置多数据源 转载于:https://www.cnblogs.com/zhujiabin/p/4816453.html

  6. 在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法

    转载自  在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法 我们在配Spring 或者Hibernate 配置文件的时候,发觉在配置类路径的时候,在双引号下 ...

  7. spring+hibernate:在applicationCOntext.XML中配置C3P0参数说明

    背景: 在项目中遇到下面这个exception Exception occurred while logging on hibernate operation: Cannot open connect ...

  8. Spring+hibernate多数据源多sessionFactory配置

    主配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...

  9. java ssh框架 struts spring hibernate 简介

    目录 什么是SSH框架 浅谈Struts 什么是Struts Struts的核心构成 为什么使用Struts 浅谈Hibernate 什么是Hibernate Hibernate的核心构成 浅谈Spr ...

最新文章

  1. 全职院士32人!这些大学,正创造奇迹!
  2. 临界区、事件、互斥量、 信号量--四种控制多线程同步与互斥的方法
  3. Special Permutation 构造,min_element,贪心(900)
  4. 【规范】前端编码规范——css 规范
  5. python学习笔记(五)集合(set)
  6. 【读书笔记】《编写高效的JavaScript程序》
  7. 工作六年 我终于学会了这项技能 可惜晚了!!!
  8. Quartz.net任务调度(石英钟定时任务)
  9. iOS启动动画效果实现
  10. matlab 误差修正模型,求问大神用R做VEC(误差修正)模型的程序包或者代码是什么啊?...
  11. 微粒群算法(PSO)
  12. sqlite的数据库文件在什么地方? sqlite数据库文件后缀名,提取方法,打开方法。
  13. MATLAB中fspecial()函数的用法
  14. PHP 网页支付支付宝支付接口对接
  15. 皮亚杰的认知发展理论
  16. 【WPS】中插入“公式”后行距不正常的解决办法
  17. CHERRY樱桃机械键盘按键
  18. 关于有道云笔记偶尔会抽风变换语言这回事
  19. 【js组件】仿照steam样式制造自定义横向纵向滚动条
  20. (超详细)大数据Hadoop之HDFS组件

热门文章

  1. 推荐系统的作用和问题
  2. 影响软件开发的两个关键性的问题
  3. 用C#访问Hotmail -转
  4. 架构设计贵在务实(转载)
  5. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)
  6. DNS协议报文(RFC1035)
  7. java 向上取整_java 中的异常处理和常用类使用
  8. JVM盘点家底查看初始默认值
  9. cpu的内容——cu的功能。操作命令的分析 || 微程序设计思想
  10. Spring的新注解——Configuration、ComponentScan、Bean、Import、PropertySource || spring整合Junit分析