HibernateTemplate与TransactionTemplate的区别?

来自:IT大全    更新日期:早些时候
hibernateTemplate的transaction不懂....~

你看看spring事务的传播行为吧, 里面详细讲解多个事务的控制,
默认下 两个事务会合并执行的,所以你的add update 会一起回滚~

HibernateTemplate是对jdbc做了封装,控制事务是用HibernateTransactionManager。练习中事务不必处理,spring会自己处理。到了公司开发,头几年你也涉及不到事务。

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 包含如下方法。
�6�1 Object dolnTransaction(TransactionStatus status) 。
该方法的方法体就是事务的执行体。
如果事务的执行体没有返回值,则可以使用TransactionCallbackWithoutResultl类的实例。这是个抽象类,不能直接实例化,只能用于创建匿名内部类。它也是TransactionCallback 接口的子接口,该抽象类包含一个抽象方法:
�6�1 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();
}
}
});
}
}


HibernateTemplate与TransactionTemplate的区别?视频

相关评论:
  • 18989611837spring 事务问题 HibernateTemplate执行修改操作,提示对象是只读状态...
    何风澜HibernateTemplateHibernateTemplate是简单易用一种函数,功能是将Hibernate 的持久层访问模板化,创建HibernateTemplate 实例后,注入一个SessionFactory 的引用,就可执行持久化操作。使用HibernateTemplate HibernateTemplate 可将Hibernate 的持久层访问模板化,使用HibernateTemplate 非常简单。创建HibernateTemplate 实例后,...

  • 18989611837spring集成hibernateTemplate 怎么正确获取session
    何风澜this.getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException,SQLException { return session.createQuery(hql).list();} });这个方式使用了Session,这个就不需要我们去处理,这样叫给容器管理去了 ...

  • 18989611837hibernatetemplate怎么清空缓存
    何风澜关于为何要使用HibernateTemplate.clear()一:session.clear()的运用,尤其在不断分页循环的时候,例如 a)在一个大集合中进行遍历,遍历msg,取出其中的含有敏感字样的对象 b)另外一种形式的内存泄露 (语法级别没有 但是可由java引起)无论是load还是get,都会首先査找缓存(一级缓存),如果没有,才会去...

  • 18989611837java中getHibernateTemplate().save(obj)方法执行了却没有保存到数据...
    何风澜或许是事务的问题?把日志级别设置成Debug,然后看调用Hibernate保存数据的细节。

  • 18989611837spring的三大功能(spring基本功能)
    何风澜在旧版本的spring和hibernate集成中,需要HibernateDAOSupport和HibernateTemplate。但是,较新版本的Spring不建议使用这两个类(这里仅做了解)。 通常我们从HibernateDAOSupport扩展我们的DAO类,并且getHibernateTemplate()方法将可用于Hibernate会话中的CRUD操作。由于这不是推荐的方法,所以我们在DAO中注入会话工厂(SessionFactory)...

  • 18989611837this.getHibernateTemplate().evict(jxjhdmx);为什么要进行托管evict,加...
    何风澜这里是用Spring的HibernateTemplate()来操作数据库,而使用HibernateTemplate()的方法类似于 使用SessionFactory.getCurrentSession()。查看Spring文档,就知道evict的作用是Remove the given object from the Session cache.即把实体类对象清除出Hibernate的session缓存,而evict只在事务内部是起作用的,一般查询语句...

  • 18989611837getHibernateTemplate().update(obj) hibernate更新问题---
    何风澜问题一,错误原因就是,你的Person对象不是持久化对象,不能直接update。解决方法,先用hql查询得到Person对象,这个对象就是持久化对象,例如你使用find方法,getHibernateTemplate().find("from Person where userName='yang' ")用户名肯定不重复,这样就查询出唯一的Person,然后你再从返回的List中遍历...

  • 18989611837求用HibernateTemplate查询数据总数的方法,返回int型的数据总数_百度知 ...
    何风澜return (int)this.HibernateTemplate.Execute( new Spring.Data.NHibernate.HibernateDelegate( delegate( ISession session ) { StringBuilder sb = new StringBuilder( 1024 );ArrayList values = new ArrayList( 6 );sb.Append( "select count(*) from SMSSend s where 1=1" );\/\/假如有变量赋值则...

  • 18989611837hibernateTemplate3.0中什么时候用find()方法 ,什么时候用createQuery...
    何风澜find()在类检索级别时总是执行立即检索而且如果检索不到相关的对象的话会返回null,他是一个重载方法。public List find(final String queryString, final Object[] values) throws DataAccessException { return (List) executeWithNativeSession(new HibernateCallback() { public Object doInHibernate(...

  • 18989611837快速切入:Spring框架核心概念总览
    何风澜在旧版本的 spring 和 hibernate 集成中,需要 HibernateDAOSupport 和 HibernateTemplate。但是,较新版本的 Spring 不建议使用这两个类(这里仅做了解)。通常我们从 HibernateDAOSupport 扩展我们的 DAO 类,并且 getHibernateTemplate() 方法将可用于Hibernate会话中的 CRUD 操作。由于这不是推荐的方法,...

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网