编程式的事务管理
另外,编程式事务提供了TransactionTemplate 模板类,该类可以大大减少事务操作的代码。因此TransactionTemplate 采用Callback 避免让开发者重复书写其打开事务、提交事务及回滚事务等代码,同时TransactionTemplate 无须书写大量的try..catch 块。
HibernateTemplate 必须提供PlatformTransactionManager 实例。该实例既可以在代码中手动设置,也可以使用Spring 的依赖注入。总之,只要获取了PlatformTransactionManager 引用, TransactionTemplate 就可以完成事务操作。
使用TransactionTemplate 不需要显式地开始事务,甚至不需要显式地提交事务。这些步骤都由模板完成。但出现异常时,应通过TransactionStatus 的setRollbackOnly 显式回滚事务。
TransactionTemplate 的execute 方法接收一个TransactionCallback 实例。Callback 也是Spring 的经典设计,用于简化用户操作, TransactionCallback 包含如下方法。
• Object dolnTransaction(TransactionStatus status) 。
该方法的方法体就是事务的执行体。
如果事务的执行体没有返回值,则可以使用TransactionCallbackWithoutResultl类的实例。这是个抽象类,不能直接实例化,只能用于创建匿名内部类。它也是TransactionCallback 接口的子接口,该抽象类包含一个抽象方法:
• void dolnTransactionWithoutResult(TransactionStatus status)该方法与dolnTransaction 的效果非常相似,区别在于该方法没有返回值,即事务执行体无须返回值。
在下面的示例中, PlatformTransactionManager 实例采用适用于Hibernate 的事务管理器来实现类HibernateTransactionManager,该实现类是个局部事务管理器,容器中仅仅部署了该事务管理器bean ,因此应在代码中于动为TransactionTemplate 注入事务管理器bean。下面是Hibernate 局部事务管理的配置文件的源代码:
<?
xml version="1.0" encoding="gb2312"
?>
<!
-- Spring 配置文件的DTD 定义--
>
<!
DOCTYPE beans PUBL工C "-//SPRING//DTD BEAN//EN"
''http://www.springfrarnework.org/dtd/sp工rng-beans.dtd"
>
<!--
Spring 配置文件的根元素是beans
-->
<
beans
>
<!--
定义数据源,该bean 的ID 为dataSource-→
<bean id="dataSource" class="org.springfrarnework.jdbc.datasource.DriverManagerDataSource">
<!-- 指定数据库驱动
-->
<
property
narne
="driverClassNarne"
><
value
>
corn.rnysql.jdbc.Driver
</
value
></
property
>
<!--
指定连接数据库的URL
-->
<
property
narne
="url"
><
value
>
jdbc:rnysql://wonder:3306/j2ee
</
value
></
property
>
<!--
root 为数据库的用户名
-->
<
property
name
="username"
><
value
>
root
</
value
></
property
>
<!--
pass 为数据库密码
-->
<
property
name
="password"
><
value
>
pass
</
value
></
property
>
</
bean
>
<!--
定义Hibernate 的SessionFactory
-->
<
bean
id
="sessionFactory"
class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
>
<!--
依赖注入数据源,注入上文定义的dataSource
-->
<
property
name
="dataSource"
><
ref
local
="dataSource"
/></
property
>
<!--
mappingResouces属性用来列出全部映射文件>
<property name="mappingResources">
<list>
<!--以下用来列出所有的PO 映射文件
-->
<
value
>
lee/MyTest.hbm.xml
</
value
>
</
list
>
</
property
>
<!--
定义Hibernate 的SessionFactory的属性
-->
<
property
name
="hibernateProperties"
>
<
props
>
<!--
指定Hibernate 的连接方法
-->
<
prop
key
="hibernate.dialect"
>
org.hibernate.dialect.MySQLDialect
</
prop
>
<!
不同数据库连接,启动时选择create , update , create-drop--
>
<
prop
key
="hibernate.hbm2ddl.auto"
>
update
</
prop
>
</
props
>
</
property
>
</
bean
>
<!--
配置Hibernate 的事务管理器一〉
<!--使用HibernateTransactionManager类,该类是PlatformTransactionManager 接口针对采用Hibernate持久化连接的特定实现。
-->
<
bean
id
="transactionManager"
class
="org.springframework.orm.hibernate3.HibernateTransactionManager"
>
<!--
HibernateTransactionManager bean 需要依赖注入一个SessionFactory bean 的引用
-->
<
property
name
="sessionFactory"
>
<
ref
local
="sessionFactory"
/>
</
property
>
</
bean
>
</
beans
>
public
class
TransactionTest
...
{
public
static
void
main(String[] args)
...
{
//
因为并未在web 应用中测试,故需要手动创建Spring 的上下文
final
ApplicationContext ctx
=
new
FileSystemXrnlApplicationContext(
"
bean.xml
"
);
//
获得Spring 上下文的事务管理器
PlatformTransactionManager transactionManager
=
(PlatformTransactionManager)ctx.getBean(
"
transactionManager
"
);
final
SessionFactory sessionFactory
=
(SessionFactory)ctx.getBean(
"
sessionFactory
"
);
//
以事务管理器实例为参数,创建TransactionTemplate对象
TransactionTemplate tt
=
new
TransactionTemplate(transactionManager);
//
设置TransactionTemplate的事务传播属性
tt. setPropagationBehavior (TransactionDefinition.PROPAGATION_REQUlRED);
//
执行TransactionTemplate的execute方法,该方法需要TransactionCallback实例
tt.execute(
new
TransactionCallbackWithoutResult()
//
采用TransactionCallbackWithoutResult匿名内部类的形式执行
protectedvoid dolnTransactionWithoutResult(TransactionStatus ts)
try
...
{
//
以SessionFactory 实例为参数创建HibernateTemplate
HibernateTemplate hibernateTemplate
=
new
HibernateTemplate(sessionFactory);
MyTestpl
=
丑ew MyTest (
"
Jack
"
);
//
保存第一个实例
hibernateTemplate.save(pl);
//
让下面的数据库操作抛出异常即可看出事务效果。前面的操作也
//
不会生效
MyTestp2
=
new
MyTest (
"
Jack
"
);
//
保存第二个实例,可将Person 的name 属性设为标识属性,并
//
引起主键重复的异常,可看出前一条记录也不会加入数据库中
hibernateTemplate.save(p2);
}
catch
(Exception e)
...
{
ts.setRollbackOnly();
}
}
}
);
}
}
另外,编程式事务提供了TransactionTemplate 模板类,该类可以大大减少事务操作的代码。因此TransactionTemplate 采用Callback 避免让开发者重复书写其打开事务、提交事务及回滚事务等代码,同时TransactionTemplate 无须书写大量的try..catch 块。
HibernateTemplate 必须提供PlatformTransactionManager 实例。该实例既可以在代码中手动设置,也可以使用Spring 的依赖注入。总之,只要获取了PlatformTransactionManager 引用, TransactionTemplate 就可以完成事务操作。
使用TransactionTemplate 不需要显式地开始事务,甚至不需要显式地提交事务。这些步骤都由模板完成。但出现异常时,应通过TransactionStatus 的setRollbackOnly 显式回滚事务。
TransactionTemplate 的execute 方法接收一个TransactionCallback 实例。Callback 也是Spring 的经典设计,用于简化用户操作, TransactionCallback 包含如下方法。
• Object dolnTransaction(TransactionStatus status) 。
该方法的方法体就是事务的执行体。
如果事务的执行体没有返回值,则可以使用TransactionCallbackWithoutResultl类的实例。这是个抽象类,不能直接实例化,只能用于创建匿名内部类。它也是TransactionCallback 接口的子接口,该抽象类包含一个抽象方法:
• void dolnTransactionWithoutResult(TransactionStatus status)该方法与dolnTransaction 的效果非常相似,区别在于该方法没有返回值,即事务执行体无须返回值。
在下面的示例中, PlatformTransactionManager 实例采用适用于Hibernate 的事务管理器来实现类HibernateTransactionManager,该实现类是个局部事务管理器,容器中仅仅部署了该事务管理器bean ,因此应在代码中于动为TransactionTemplate 注入事务管理器bean。下面是Hibernate 局部事务管理的配置文件的源代码:















































下面是采用TransactionTemplate和HibemateTemplate的事务操作代码:











































