永发信息网

HibernateTemplate与TransactionTemplate的区别?

答案:2  悬赏:10  手机版
解决时间 2021-08-10 19:06
spring已经提供了HibernateTemplate ,它当中已经包括了事务的提交和回滚
那么为什么还要有TransactionTemplate来管理事务呢?
TransactionTemplate到底有什么实际的作用啊?能举个例子吗?
(我要搬个板凳看高人分析……)
最佳答案
TransactionTemplate 没有使用抽象类,在它的execute()方法里定义事务处理的骨架代码.但execute()方法的TransactionCallback参数却是个接口,在这接口中定义了doInTransaction()方法
只要实现TransactionCallback接口,并在doInTransaction()方法里编写具体要进行的事务处理的代码就可以 了.
全部回答

编程式的事务管理 另外,编程式事务提供了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>

下面是采用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();     }     }     });     }     }

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
山城区鹤壁汤河桥街道办事处南岸社区居委会这
泡沫之夏第17 18集高清在线观看 湖南卫视泡沫
Lenovo Y430 本本电池,充电100%但用10几分钟
四年级上册美术雪花飘飘咋做?
你刚才说PK推荐魔弓?为什么啊?游侠PK加点玩
发动机废气大
帮我找与 “1种小渴望╮” 是情侣的网名
HTC HD2游戏在哪下最多最好??
监利县荆州全网通手机卖场地址在什么地方,想
QQ号消费密码被改怎么找回啊
大学中真的可以孤单一人么
让步状语从句是什么
刺青为什么会慢慢的淡掉?
心窝痛是怎么回事?
七雄争霸 我的钻在北京三用了,我重新玩别的
推荐资讯
有哪些电影好看呢
从洛阳出发七日华东五市怎样安排行程
我该怎么选择?同时有两个女人喜欢上我!
我的电脑是方正卓越K100系列,显卡是VIA/S3G
在0~9这十个阿拉伯数字中,只有多少个在镜子
易语言在学习啊?
帮我介绍一款合理套餐
婚姻保卫战24在线观看+播放+免费下载
成都最好的不孕不育医院?
雨湖区湘潭太极大药房(湖南反笸ㄔ返?怎么去
卧龙区南阳万和饭店这个地址在什么地方,我要
女孩来帮帮忙吖!
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?