Spring整合Hibernate事务简单应用。文章简单介绍两种事务的使用,一是Spring注解的声明式事务,另一个是编程式事务。
在Spring中配置注解声明式事务,配置如下
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 使用spring注解 --> <!-- <context:annotation-config/> --> <!-- 下面的配置告诉spring容器自动scanner用注解标注bean --> <context:component-scan base-package="org.lian"/> <!--配置数据源 --> <!-- <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> --> <!-- 配置Druid数据库连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本属性 url、user、password --> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <property name="maxActive" value="20" /> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 --> <property name="filters" value="stat" /> </bean> <!-- 配置Hibernate SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" lazy-init="false"> <!-- 注入datasource,给sessionfactoryBean内setdatasource提供数据源 --> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:conf/hibernate/hibernate.cfg.xml"></property> <!-- //加载实体类的映射文件位置及名称 --> <property name="mappingLocations" value="classpath:conf/hibernate/domain/*.hbm.xml"></property> <property name="packagesToScan" value="org.lian.**.domain"></property> </bean> <context:property-placeholder location="classpath*:conf/datasource/jdbc.properties"/> <!-- 采用注解的方式 声明事务 --> <tx:annotation-driven transaction-manager="txManager"/> <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- <aop:config> <aop:pointcut id="businessMethods" expression="execution(* org.lian.business.*Business.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="businessMethods"/> </aop:config> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="addMusic*" propagation="REQUIRED"/> <tx:method name="editMusic*" propagation="REQUIRES_NEW"/> <tx:method name="*" propagation="SUPPORTS" read-only="true"/> </tx:attributes> </tx:advice> --> </beans>
使用Hibernate事务,获取session的方式有要求,强烈推荐使用下面的方式getCurrentSession(),openSession()方式实验了几次事务无法正常回滚。dao层的代码
@Repository("musicH4Dao") public class MusicH4DaoImpl implements MusicDao { @Autowired private SessionFactory sessionFactory; @Override public void update(Music music) { Session session = sessionFactory.getCurrentSession(); session .createQuery( "update Music as music set music.name=:name where music.id=:id ") .setParameter("name", music.getName()) .setParameter("id", music.getId()).executeUpdate(); } @Override public void add(Music music) { Session session = sessionFactory.getCurrentSession(); session.save(music); session.flush(); } }
业务层处理事务有两种方式,一种是声明式事务
@Service("musicBusiness") @Transactional(readOnly = true) public class MusicBusinessImpl implements MusicBusiness { @Autowired @Qualifier("musicH4Dao") private MusicDao musicDao; @Override @Transactional(readOnly = false, rollbackFor = { Exception.class }) public void addMusic(Music music) { musicDao.add(music); Music bean = new Music(); bean.setId("123"); bean.setName("测试" + IdGenerator.getInstance().getUUID()); musicDao.update(bean); } }
另一种采用编程式事务处理
@Service("music2Business") public class Music2BussinessImpl implements MusicBusiness { private TransactionTemplate transactionTemplate; @Qualifier("txManager") @Autowired public void setTransactionManager( PlatformTransactionManager transactionManager) { this.transactionTemplate = new TransactionTemplate(transactionManager); } @Autowired @Qualifier("musicH4Dao") private MusicDao musicDao; @Override public void addMusic(final Music music) { // TODO Auto-generated method stub this.transactionTemplate.execute(new TransactionCallbackWithoutResult() { public void doInTransactionWithoutResult(TransactionStatus status) { musicDao.add(music); Music bean = new Music(); // music.setName("测试"); bean.setId("123"); bean.setName("测试" + IdGenerator.getInstance().getUUID()); musicDao.update(bean); } }); /* * transactionTemplate.execute(new TransactionCallback<String>() { // the * code in this method executes in a transactional context public String * doInTransaction(TransactionStatus status) { return null; } }); */ } }
相关推荐
spring与hibernate的整合 spring事务的配置
spring1.2的jar包 博文链接:https://battlehawk.iteye.com/blog/282597
spring mvc hibernate整合,采用MyEclipse自动生成包和配置文件,jar包可能有多余,但是不影响整体效果。服务器tomcat。数据库mysql。
含JAR包,Spring4.2.0.RC3+Hibernate4.3.10.Final,目前最新包,事务使用XML配置,含通用DAO,内有运行小实例,整合多位大神资料,感谢他们!
springboot(4) 整合mybatis和hibernate 请删除项目中本地仓库的配置,或者改成国内的公共仓库,否则将无法启动
12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...
spring、struts、hibernate+mybatis 整合在在一起
从http://www.cnblogs.com/sunniest/p/4543271.html 这里摘抄的源码,具体教程可以看这个文章
Spring4.0+Hibernate4.0+Struts2.3整合案例:实现增删改查。 ===================== application.xml: xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...
Struts2 Spring3 Hibernate3.3框架整合,增删改查,包含有数据库建表语句,包含有JAR包,包含有源代码。包含有事务的配置以及运用。使用的是Oracle的序列来提供的主键自增,建表和建立序列的sql语句,已经放在工程...
在准备整合Spring之前,也在网上看了各种配置。但是楼主心里还是很纠结,为啥一定要配置事务。配事务就陪事务为啥要配拦截,配拦截就配拦截为啥要配自动代理。都是因为楼主是java菜鸟。不然这些肯定是java方面的常识...
部门人员一对多的CRUD操作 hibernate: 管理实体...spring:数据源配置与获得session IOC依赖注入 和 AOP 事务管理 jsf : backing bean的操作 jsf 标签应用 jsf 信息国际化以资源绑定 jsf 表单验证 jsf 导航设定
12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...
整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 + Quartz2.2.1。 此外,还有:Quartz、JUnit4、Log4j、SLF4J、...
其中包含apache的log4j记录日志信息,spring管理组件,springmvc分层,springaop配置数据库事务控制,hibernate二级缓存配置,实现了查询,用户登录注册,请求验证是否登录等基础功能Demo,基于后台测试,使用前台...
第24次课-1 Spring与Hibernate的整合 本节主要内容 24.1 概述 24.2 管理SessionFactory 24.3 Spring对Hibernate的简化 24.1 概述 24.1.1 概述 Spring提供了很多IoC特性的支持,方便处理大部分典型的Hibernate整合...
详细讲述spring与hibernate之间的配置、整合,以及事务控制等内容。
详细示范了当前java里面流行的三大框架的整合,对于spring的配置文件applicationContext.xml做了详细的注释说明,里面包含数据库连接池、Hibernate里的SessionFactory、事务等重点模块的配置。在实际开发过程中多数...
12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...
有关Struts spring hibernate整合以及事务的处理和相关的配置,还有一些必要的代码。已经整理好了。