Spring+Hibernate的典型配置
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&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&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&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的典型配置相关推荐
- firebird——Spring hibernate 集成连接配置
-Djava.library.path=.\lib\ firebird版本是2.5, 嵌入式类库是2.2 这些都可以从官网中下载. 我用的是netbeans,在java 项目中新建一个lib文件夹,把 ...
- spring+hibernate+mysql mvc 配置
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-// ...
- Spring MVC+Spring +Hibernate配置事务,但是事务不起作用
最近做项目,被一个问题烦恼了很久.使用Spring MVC+Spring +Hibernate开发项目,在使用注解配置事务管理,刚开始发现无论如何数据库都无法更新,但是可以从数据库查询到数据.怀疑是配 ...
- Spring+Hibernate+c3p0连接池配置-连接无法释放的问题解决方案
1.Spring+Hibernate+c3p0连接池配置: <?xml version="1.0" encoding="UTF-8"?> < ...
- Spring+Hibernate配置多数据源
Spring+Hibernate配置多数据源 转载于:https://www.cnblogs.com/zhujiabin/p/4816453.html
- 在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法
转载自 在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法 我们在配Spring 或者Hibernate 配置文件的时候,发觉在配置类路径的时候,在双引号下 ...
- spring+hibernate:在applicationCOntext.XML中配置C3P0参数说明
背景: 在项目中遇到下面这个exception Exception occurred while logging on hibernate operation: Cannot open connect ...
- Spring+hibernate多数据源多sessionFactory配置
主配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...
- java ssh框架 struts spring hibernate 简介
目录 什么是SSH框架 浅谈Struts 什么是Struts Struts的核心构成 为什么使用Struts 浅谈Hibernate 什么是Hibernate Hibernate的核心构成 浅谈Spr ...
最新文章
- 全职院士32人!这些大学,正创造奇迹!
- 临界区、事件、互斥量、 信号量--四种控制多线程同步与互斥的方法
- Special Permutation 构造,min_element,贪心(900)
- 【规范】前端编码规范——css 规范
- python学习笔记(五)集合(set)
- 【读书笔记】《编写高效的JavaScript程序》
- 工作六年 我终于学会了这项技能 可惜晚了!!!
- Quartz.net任务调度(石英钟定时任务)
- iOS启动动画效果实现
- matlab 误差修正模型,求问大神用R做VEC(误差修正)模型的程序包或者代码是什么啊?...
- 微粒群算法(PSO)
- sqlite的数据库文件在什么地方? sqlite数据库文件后缀名,提取方法,打开方法。
- MATLAB中fspecial()函数的用法
- PHP 网页支付支付宝支付接口对接
- 皮亚杰的认知发展理论
- 【WPS】中插入“公式”后行距不正常的解决办法
- CHERRY樱桃机械键盘按键
- 关于有道云笔记偶尔会抽风变换语言这回事
- 【js组件】仿照steam样式制造自定义横向纵向滚动条
- (超详细)大数据Hadoop之HDFS组件
热门文章
- 推荐系统的作用和问题
- 影响软件开发的两个关键性的问题
- 用C#访问Hotmail -转
- 架构设计贵在务实(转载)
- Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)
- DNS协议报文(RFC1035)
- java 向上取整_java 中的异常处理和常用类使用
- JVM盘点家底查看初始默认值
- cpu的内容——cu的功能。操作命令的分析 || 微程序设计思想
- Spring的新注解——Configuration、ComponentScan、Bean、Import、PropertySource || spring整合Junit分析