Spirng 4 、Hibernate 4 事务管理

建议将 Hibernate SessionFactory 交给 Spring 进行事务管理,在 applicationContext.xml 里面配置

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!-- 数据源 --> <property name="dataSource" ref="dataSource" /> <!-- hibernate的相关属性配置 --> <property name="hibernateProperties"> <props>
 ...
</bean> <!-- 定义事务管理 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> <!-- 自动扫描实体对象 com.waylau.entity 的包结构中存放实体类 --> <property name="packagesToScan" value="com.waylau.entity" /> </bean> 

使用 SessionFactory

@Autowired private SessionFactory sessionFactory;

public Session getSession() {
 return sessionFactory.getCurrentSession();
}

延伸

声明事务

方法1

在调用的类或者方法上加 @Transactional注解

/**
 * @author waylau.com 2015年1月3日
 */ @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
@Transactional public class TestSdUserDaoImpl {

 @Autowired private SdUserDaoImpl sdUserDaoImpl;

 @Test public void countAllTest() {
 System.out.println(sdUserDaoImpl.countAll());
 }
 @Test public void findByIdTest() {
 SdUser e = sdUserDaoImpl.findById(1);

 System.out.println(e.getRealname());
 }

}

方法2

用 Spring AOP

<!-- 扫描有注解的文件 base-package 包路径 --> <context:component-scan base-package="com" /> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 事务执行方式 REQUIRED:指定当前方法必需在事务环境中运行, 如果当前有事务环境就加入当前正在执行的事务环境, 如果当前没有事务,就新建一个事务。
 这是默认值。 --> <tx:method name="create*" propagation="REQUIRED" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="import*" propagation="REQUIRED" /> <!-- 指定当前方法以非事务方式执行操作,如果当前存在事务,就把当前事务挂起,等我以非事务的状态运行完,再继续原来的事务。 查询定义即可
 read-only="true" 表示只读 --> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="load*" propagation="REQUIRED" read-only="true" /> <tx:method name="*" propagation="NOT_SUPPORTED" read-only="true" /> </tx:attributes> </tx:advice> <!-- 定义切面,在 com.emsc.service.impl.*.*(..) 中执行有关的hibernate session的事务操作 --> <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* com.emsc.service..*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" /> </aop:config> 

这样就定义了那些类或者那些方法需要执行事务

问题

假如如此配置还有事务上的问题,如下:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134) at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
 ...

如果用 aop 有出现问题,请将<aop:config> 改为 <aop:config proxy-target-class="true">


时间: 2025-01-29 21:54:51

Spirng 4 、Hibernate 4 事务管理的相关文章

Spring与Hibernate整合事务管理的理解_java

在谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据操作,然后提交事务,关闭事务,我们这样做的原因是因为Hibernate默认的事务自动提交是false,他是需要我们人为的手动提交事务,假如你不想每次都手动提交事务的话,你可以在hibernate.cfg.xml我文件中把它设置为事务自动提交: xml代码 <property name="def

SPRING进行事务管理简单问题

问题描述 我用SSH进行开发,使用SPRING代理STRUTS,我想进行HIBERNATE的事务管理,如果我显性进行事务管理,可以成功,但是在SPRING中配置事务就会出现异常,说无法创建bean.就是说我把事务管理的这段代码删除掉就异常了我的SPRING配置如下<!--下边是代理的struts的action--><bean name="/insert" class="com.yourcompany.struts.action.InsertAction&qu

【spring框架】spring使用Annotation进行声明式事务管理

声明式的事务管理 a)事务加在DAO层还是Service层? UserService调了UserDao,调了它的save方法,而UserDao它会去访问数据库. 在Dao里面,事务的还是就是save的开始,事务的结束就是save的结束,这是最直观的.也可以用AOP来写,Spring已经给你写好了. 那么事物的边界(beginTransaction()事务开始和事物结束getTransaction().commit())加在哪里比较好呢? Dao一般都是固定的单一的CRUD,也就是核心的事务操作,

Spring 事务管理高级应用难点剖析: 第 1 部分

Spring 的事务管理是被使用得最多的功能之一,虽然 Spring 事务管理已经帮助程序员将要做的事情减到了最小.但在实际开发中,如果使用不当,依然会造成数据连接泄漏等问题.本系列以实际应用中所碰到的各种复杂的场 景为着眼点,对这些应用的难点进行深度的剖析. DAO 和事务管理的牵绊 很少有使用 Spring 但不使用 Spring 事务管理器的应用,因此常常有人会问:是否用了 Spring,就一定要用 Spring 事务管理器,否则就无法进行数据的持久化操作呢?事务管理器和 DAO 是什么关

事务管理-hibernate和mybatis事务问题

问题描述 hibernate和mybatis事务问题 我想在web应用中使用hibernate和mybatis配合做数据持久化,但是遇到数据源和 事务的问题.首先hibernate是使用的proxool连接池,在自己写的hibernate工具 类中加载hibernate的sessionFactory以及session的打开和事务管理等.那么问题 来了,我在mybatis中该如何配置来使用连接池,以及和hibernate使用同一个事务. 请大神支招. 解决方案 spring集成mybatis事务问

spring的事务管理配置

一般的,我们把事务配在service层,利用service的业务逻辑接口统一的管理. 为什么不用在dao层呢? 因为一个service有可能调用多个dao,而这多个dao有可能相互联系,有时候一个操作需要调用多次数据库,但是这多次调用要么全提交,要么全回滚. 因此,在dao层调用事务理论上说不是一个很明智的选择.应该有业务逻辑层service层负责事务,统一处理. Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三

Spring事务管理高级应用难点剖析: 第2部分

联合军种作战的混乱 Spring 抽象的 DAO 体系兼容多种数据访问技术,它们各有特 色,各有千秋.像 Hibernate 是非常优秀的 ORM 实现方案,但对底层 SQL 的控制不太方便: 而 iBatis 则通过模板化技术让您方便地控制 SQL,但没有 Hibernate 那样高的开发效率:自 由度最高的当然是直接使用 Spring JDBC 莫属了,但是它也是最底层的,灵活的代价是代码的 繁复.很难说哪种数据访问技术是最优秀的,只有在某种特定的场景下,才能给出答案.所以 在一个应用中,往

hibernate的事务和spring事务的区别

对于传统的基于特定事务资源的事务处理而言(如基于JDBC的数据库访问),Spring并不会对其产生什么影响,我们照样可以成功编写并运行这样的代码.同时,Spring还提供了一些辅助类可供我们选择使用,这些辅助类简化了传统的数据库操作流程,在一定程度上节省了工作量,提高了编码效率. 对于依赖容器的参数化事务管理而言,Spring则表现出了极大的价值.Spring本身也是一个容器,只是相对EJB容器而言,Spring显得更为轻便小巧.我们无需付出其他方面的代价,即可通过Spring实现基于容器的事务

Hibernate的事务和并发(二)

12.2.1.非托管环境 如果Hibernat持久层运行在一个非托管环境中,数据库连接通常由Hibernate的连接池机制 来处理. 代码内容 session/transaction处理方式如下所示: //Non-managed environment idiom Session sess = factory.openSession(); Transaction tx = null; try { tx = sess.beginTransaction(); // do some work ...