西宁兄弟连IT培训学校

176-9726-0023

Java学习-编程式的事务管理【Java培训】

编辑:西宁兄弟连IT培训学校时间:2019-05-31

程式事务提供了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 局部事务管理的配置文件的源代码:

''http://www.springfrarnework.org/dtd/sp工rng-beans.dtd">

corn.rnysql.jdbc.Driver

jdbc:rnysql://wonder:3306/j2ee

root

pass

lee/MyTest.hbm.xml

org.hibernate.dialect.MySQLDialect

update

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

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();

}

}

});

}

}


上一篇:刚从Java培训班毕业好找工作吗?

下一篇:什么样的Python培训机构才是好机构?

联系方式

选择专业时,如果犹豫不定,不知道选择哪个比较好,敬请致电,专业的咨询老师会为你解答。

  • 报名热线:176-9726-0023
  • 咨询老师:严老师
  • 点击咨询:

友情连接:

关于我们|联系我们|网站地图

QQ咨询
在线咨询
在线报名
176-9726-0023
返回顶部