永发信息网

HibernateTemplate与TransactionTemplate的区别?

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

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

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯