Welcome 微信登录

首页 / 软件开发 / JAVA / Spring事务管理高级应用难点剖析: 第2部分

Spring事务管理高级应用难点剖析: 第2部分2012-04-26 IBM 陈雄华联合军种作战的混乱

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

但是,这种联合 军种如何应对事务管理的问题呢?我们知道 Spring 为每种数据访问技术提供了相应的事务管 理器,难道需要分别为它们配置对应的事务管理器吗?它们到底是如何协作,如何工作的呢? 这些层出不穷的问题往往压制了开发人员使用联合军种的想法。

其实,在这个问题上, 我们低估了 Spring 事务管理的能力。如果您采用了一个高端 ORM 技术(Hibernate,JPA, JDO),同时采用一个 JDBC 技术(Spring JDBC,iBatis),由于前者的会话(Session)是对 后者连接(Connection)的封装,Spring 会“足够智能地”在同一个事务线程让前 者的会话封装后者的连接。所以,我们只要直接采用前者的事务管理器就可以了。下表给出了 混合数据访问技术所对应的事务管理器:

表 1. 混合数据访问技术的事务管理器

混合数据访问技术事务管理器
ORM 技 术框架JDBC 技术框架
HibernateSpring JDBC 或 iBatisHibernateTransactionManager
JPASpring JDBC 或 iBatisJpaTransactionManager
JDOSpring JDBC 或 iBatisJdoTransactionManager
由于一般不会 出现同时使用多个 ORM 框架的情况(如 Hibernate + JPA),我们不拟对此命题展开论述,只 重点研究 ORM 框架 + JDBC 框架的情况。Hibernate + Spring JDBC 可能是被使用得最多的组 合,下面我们通过实例观察事务管理的运作情况。

清单 1.User.java:使用了注解声明 的实体类

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Id;
import java.io.Serializable;

@Entity
@Table(name="T_USER")
public class User implements Serializable{
@Id
@Column(name = "USER_NAME")
private String userName;
private String password;
private int score;

@Column(name = "LAST_LOGON_TIME")
private long lastLogonTime = 0;
}