- 浏览: 86717 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
shu_jian:
太深奥了,看不太懂啊
声明式事务管理 -
hengstart:
谢谢了!在你这里看了不少东西,交个朋友,我也在上海java的! ...
mysql有种类型不支持事物 -
hengstart:
看不出来结果啊!什么都没有!
mysql有种类型不支持事物 -
whg333:
拉登的足球 写道最简单的方式
看的时机: 在人物的脚转到最左 ...
一张图分出你是用左脑还是右脑! -
whg333:
Jason(aijun) 写道
唯心主义者应该非常喜欢这 ...
一张图分出你是用左脑还是右脑!
Spring的编程式事务处理,需要使用Hibernate事务回调接口,事务回调接口可以管理Hibernate的事务:
TransactionCallbackWithoutResult —— 执行事务没有返回值,例如save、update、delete等等;
TransactionCallback —— 执行事务处理后有返回值,如find要返回结果集(List);
使用Spring的IoC容器来管理bean,具体注入的过程为:
装配DataSource —— 将DataSource注入到SessionFactory Bean中 —— 将SessionFactory Bean注入到HibernateTransactionManager中 —— 将SessionFactory Bean与HibernateTransactionManager Bean一起都注入到DAO中
对应的Spring的配置文件applicationContext.xml的配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="threeDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.microsoft.jdbc.sqlserver.SQLServerDriver">
</property>
<property name="url"
value="jdbc:microsoft:sqlserver://localhost:1433;databasename=hibernate">
</property>
<property name="username" value="sa"></property>
<property name="password" value="111111"></property>
</bean>
<bean id="threeSessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="threeDataSource" />
</property>
<property name="mappingResources">
<list>
<value>org/shirdrn/entity/Person.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">
true
</prop>
</props>
</property>
</bean>
<bean id="hTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="sessionFactory">
<ref bean="threeSessionFactory" />
</property>
</bean>
<bean id="threePersonDao" class="org.shirdrn.no.three.dao.PersonDao"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="transactionManager">
<ref bean="hTransactionManager"/>
</property>
<property name="sessionFactory">
<ref bean="threeSessionFactory" />
</property>
</bean>
</beans>
实体类Person对应DAO的服务接口为IPerson,如下所示:
package org.shirdrn.no.three.interf;
import java.util.List;
import org.shirdrn.entity.Person;
public interface IPersonDao {
public void createPerson(Person person);
public void updatePerson(Person person);
public void deletePerson(Person person);
public List queryPerson(String hql);
public Person queryOnePerson(String hql);
}
PersonDao实现了服务接口IPerson,同时必须集成HibernateDaoSupport,因为在HibernateDaoSupport中实现了DataSource、SessionFactory的setter方法,继承HibernateDaoSupport从而将SessionFactory注入到DAO中可以简化编程。
PersonDao的实现如下所示:
package org.shirdrn.no.three.dao;
import java.util.List;
import org.shirdrn.entity.Person;
import org.shirdrn.no.three.interf.IPersonDao;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
public class PersonDao extends HibernateDaoSupport implements IPersonDao{
private TransactionTemplate transactionTemplate;
public void setTransactionManager(PlatformTransactionManager transactionManager){ // 注入TransactionManager
this.transactionTemplate = new TransactionTemplate(transactionManager); // 以注入的TransactionManager作为参数,获取一个TransactionTemplate实例,该实例封装了Hibernate的行为
}
public void createPerson(final Person person) {
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
transactionTemplate.execute(new TransactionCallbackWithoutResult(){ // 使用无返回值的事务回调接口
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
getHibernateTemplate().save(person);
}
});
}
public void deletePerson(final Person person) {
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
transactionTemplate.execute(new TransactionCallbackWithoutResult(){ // 使用无返回值的事务回调接口
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
getHibernateTemplate().delete(person);
}
});
}
public void updatePerson(final Person person) {
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
transactionTemplate.execute(new TransactionCallbackWithoutResult(){ // 使用无返回值的事务回调接口
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
getHibernateTemplate().update(person);
}
});
}
public List queryPerson(final String hql) {
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
List list = (List)transactionTemplate.execute(new TransactionCallback(){ // 使用带返回值的事务回调接口
public Object doInTransaction(TransactionStatus arg0) {
System.out.println(hql);
return getHibernateTemplate().find(hql);
}
});
return list;
}
public Person queryOnePerson(final String hql) {
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
return (Person)transactionTemplate.execute(new TransactionCallback(){ // 使用带返回值的事务回调接口
public Object doInTransaction(TransactionStatus arg0) {
return getHibernateTemplate().find(hql).get(0);
}
});
}
}
编写测试函数,如下所示:
package org.shirdrn.no.three.test;
import org.shirdrn.entity.Person;
import org.shirdrn.no.three.interf.IPersonDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
IPersonDao personDao = (IPersonDao)ctx.getBean("threePersonDao");
/**
* 测试save
*/
/*Person p = new Person();
p.setId("200804150016");
p.setName("Sujnn");
p.setAddr("Shanghai");
p.setAge(new Integer(22));
p.setGender("male");
personDao.createPerson(p);*/
/**
* 测试update
*/
/*Person p = new Person();
p.setId("200804150016");
p.setName("SujnnXXX");
p.setAddr("Hongkong");
p.setAge(new Integer(22));
p.setGender("male");
personDao.updatePerson(p);*/
/**
* 测试delete
*/
/*Person p = new Person();
p.setId("200804150016");
personDao.deletePerson(p);*/
/**
* 测试find(HQL)
*/
/*List list = personDao.queryPerson("from Person");
for(Object o : list.toArray()){
Person p = (Person)o;
System.out.println("Id = "+p.getId());
System.out.println("Name = "+p.getName());
System.out.println("Addr = "+p.getAddr());
System.out.println("******************************");
}*/
/**
* 测试find(Person)
*/
Person p = personDao.queryOnePerson("from Person p where p.id='200804150015'");
System.out.println("Id = "+p.getId());
System.out.println("Name = "+p.getName());
System.out.println("Addr = "+p.getAddr());
System.out.println("Gender= "+p.getGender());
System.out.println("Age = "+p.getAge());
}
}
以上主函数中的五个测试均成功。
TransactionCallbackWithoutResult —— 执行事务没有返回值,例如save、update、delete等等;
TransactionCallback —— 执行事务处理后有返回值,如find要返回结果集(List);
使用Spring的IoC容器来管理bean,具体注入的过程为:
装配DataSource —— 将DataSource注入到SessionFactory Bean中 —— 将SessionFactory Bean注入到HibernateTransactionManager中 —— 将SessionFactory Bean与HibernateTransactionManager Bean一起都注入到DAO中
对应的Spring的配置文件applicationContext.xml的配置如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="threeDataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.microsoft.jdbc.sqlserver.SQLServerDriver">
</property>
<property name="url"
value="jdbc:microsoft:sqlserver://localhost:1433;databasename=hibernate">
</property>
<property name="username" value="sa"></property>
<property name="password" value="111111"></property>
</bean>
<bean id="threeSessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="threeDataSource" />
</property>
<property name="mappingResources">
<list>
<value>org/shirdrn/entity/Person.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="hibernate.show_sql">
true
</prop>
</props>
</property>
</bean>
<bean id="hTransactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="sessionFactory">
<ref bean="threeSessionFactory" />
</property>
</bean>
<bean id="threePersonDao" class="org.shirdrn.no.three.dao.PersonDao"
abstract="false" singleton="true" lazy-init="default"
autowire="default" dependency-check="default">
<property name="transactionManager">
<ref bean="hTransactionManager"/>
</property>
<property name="sessionFactory">
<ref bean="threeSessionFactory" />
</property>
</bean>
</beans>
实体类Person对应DAO的服务接口为IPerson,如下所示:
package org.shirdrn.no.three.interf;
import java.util.List;
import org.shirdrn.entity.Person;
public interface IPersonDao {
public void createPerson(Person person);
public void updatePerson(Person person);
public void deletePerson(Person person);
public List queryPerson(String hql);
public Person queryOnePerson(String hql);
}
PersonDao实现了服务接口IPerson,同时必须集成HibernateDaoSupport,因为在HibernateDaoSupport中实现了DataSource、SessionFactory的setter方法,继承HibernateDaoSupport从而将SessionFactory注入到DAO中可以简化编程。
PersonDao的实现如下所示:
package org.shirdrn.no.three.dao;
import java.util.List;
import org.shirdrn.entity.Person;
import org.shirdrn.no.three.interf.IPersonDao;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
public class PersonDao extends HibernateDaoSupport implements IPersonDao{
private TransactionTemplate transactionTemplate;
public void setTransactionManager(PlatformTransactionManager transactionManager){ // 注入TransactionManager
this.transactionTemplate = new TransactionTemplate(transactionManager); // 以注入的TransactionManager作为参数,获取一个TransactionTemplate实例,该实例封装了Hibernate的行为
}
public void createPerson(final Person person) {
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
transactionTemplate.execute(new TransactionCallbackWithoutResult(){ // 使用无返回值的事务回调接口
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
getHibernateTemplate().save(person);
}
});
}
public void deletePerson(final Person person) {
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
transactionTemplate.execute(new TransactionCallbackWithoutResult(){ // 使用无返回值的事务回调接口
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
getHibernateTemplate().delete(person);
}
});
}
public void updatePerson(final Person person) {
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
transactionTemplate.execute(new TransactionCallbackWithoutResult(){ // 使用无返回值的事务回调接口
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
getHibernateTemplate().update(person);
}
});
}
public List queryPerson(final String hql) {
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
List list = (List)transactionTemplate.execute(new TransactionCallback(){ // 使用带返回值的事务回调接口
public Object doInTransaction(TransactionStatus arg0) {
System.out.println(hql);
return getHibernateTemplate().find(hql);
}
});
return list;
}
public Person queryOnePerson(final String hql) {
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
return (Person)transactionTemplate.execute(new TransactionCallback(){ // 使用带返回值的事务回调接口
public Object doInTransaction(TransactionStatus arg0) {
return getHibernateTemplate().find(hql).get(0);
}
});
}
}
编写测试函数,如下所示:
package org.shirdrn.no.three.test;
import org.shirdrn.entity.Person;
import org.shirdrn.no.three.interf.IPersonDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
IPersonDao personDao = (IPersonDao)ctx.getBean("threePersonDao");
/**
* 测试save
*/
/*Person p = new Person();
p.setId("200804150016");
p.setName("Sujnn");
p.setAddr("Shanghai");
p.setAge(new Integer(22));
p.setGender("male");
personDao.createPerson(p);*/
/**
* 测试update
*/
/*Person p = new Person();
p.setId("200804150016");
p.setName("SujnnXXX");
p.setAddr("Hongkong");
p.setAge(new Integer(22));
p.setGender("male");
personDao.updatePerson(p);*/
/**
* 测试delete
*/
/*Person p = new Person();
p.setId("200804150016");
personDao.deletePerson(p);*/
/**
* 测试find(HQL)
*/
/*List list = personDao.queryPerson("from Person");
for(Object o : list.toArray()){
Person p = (Person)o;
System.out.println("Id = "+p.getId());
System.out.println("Name = "+p.getName());
System.out.println("Addr = "+p.getAddr());
System.out.println("******************************");
}*/
/**
* 测试find(Person)
*/
Person p = personDao.queryOnePerson("from Person p where p.id='200804150015'");
System.out.println("Id = "+p.getId());
System.out.println("Name = "+p.getName());
System.out.println("Addr = "+p.getAddr());
System.out.println("Gender= "+p.getGender());
System.out.println("Age = "+p.getAge());
}
}
以上主函数中的五个测试均成功。
发表评论
-
java.util.ConcurrentModificationException
2012-05-15 14:15 842java.util.ConcurrentModificatio ... -
Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)
2010-04-15 13:35 1275什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什 ... -
Hibernate HQL查询
2009-07-09 15:32 2079Hibernate HQL查询 参数绑 ... -
editplus 编译 运行 执行 java 类
2009-03-26 16:50 1293关键字: editplus 编译 运行 执行 java 类 ... -
Resin:解决找不到com.sun.tools.javac.Main问题
2009-03-26 14:35 5211java.lang.ClassNotFoundExceptio ... -
Maven2 安装
2009-03-26 10:25 1967Maven2 安装 Maven 是一个构建工 ... -
jar打包详解
2008-10-16 15:51 1021为什么会有这个玩意呢 ... -
关于UML 2中结构图的介绍
2008-10-13 11:42 1834关于UML 2中结构图的 ... -
在 Java 中如何进行 BASE64 编码和解码
2008-10-09 09:47 1632BASE64 编码是一种常用的字符编码,在很多地方都会用到。 ... -
几种常见的异常
2008-10-08 17:12 753今天在做项目的时候报了这样一个错,所以我整理一些常见的异常,以 ... -
用PHP和MySQL保存和输出图片
2008-10-08 16:27 1421设置数据库 我们通常在数据库中所使用的文本 ... -
小议lIOC
2008-09-27 12:50 8711.ioc定义 IoC就是Inversion of Co ... -
读取显示当前目录下的文件及目录-java io
2008-09-24 18:04 2598很简单的一个需求,要求读取当前目录下所有的文件和目录,并显示出 ... -
為什么需要內部類
2008-09-24 18:00 795為什么需要內部類?有什么好處呢?感覺不用也沒什么,我也這樣任為 ... -
ext+dwr完整的例子(包括树, 增删改查等)
2008-09-23 08:40 1785---js var UI = function(){ v ... -
一个通用的ProxyMap
2008-09-19 09:23 2438先来一个通用的ProxyMap。如果不需要重用,这个类可以不用 ... -
声明式事务管理
2008-09-18 13:44 1627大多数Spring用户选择声 ... -
spring中使用编程级的事务
2008-09-18 10:56 2431使用org.springframework.transacti ... -
HibernateTemplate中HibernateCallback的事务
2008-09-18 10:42 1767目的:使用HibernateTemplate执行execute ... -
An internal error occurred during: Generating Art
2008-09-16 13:05 2785今天做项目遇到了这样一个问题:An internal erro ...
相关推荐
总的来说,`TransactionTemplate`为Spring编程式事务提供了一种简洁、可复用的解决方案。通过它,开发者可以在不牺牲事务控制灵活性的同时,避免过多的事务管理代码侵入业务逻辑。然而,在实际应用中,应当根据项目...
3. **TransactionTemplate**: Spring提供的一个工具类,简化了编程式事务管理的代码,使得我们可以专注于业务逻辑而不是事务控制。通过设置TransactionDefinition和执行execute方法,我们可以在一个回调函数中编写...
Spring 提供了多种方式来实现编程式事务管理,例如使用 TransactionTemplate 或者直接使用 PlatformTransactionManager。 声明式事务管理 声明式事务管理是指通过配置文件或注解来管理事务。 Spring 提供了多种...
编程式事务管理允许开发者通过代码来精确控制事务的边界,而`TransactionTemplate`就是Spring为编程式事务管理提供的一种便捷工具。 `TransactionTemplate`类是Spring框架的`org.springframework.transaction....
在本篇"Spring学习之八--Hibernate编程式事务"中,我们将探讨如何在Spring框架中使用Hibernate进行编程式事务管理。编程式事务管理是相对于声明式事务管理的一种方式,它允许开发者通过代码来显式控制事务的开始、...
Spring 提供了多种方式来实现编程式事务管理,例如使用 TransactionTemplate、TransactionInterceptor 等。 六、声明式事务管理 声明式事务管理是指通过配置文件或注解的方式来管理事务的提交和回滚。 Spring ...
本教程将深入探讨 Spring 的编程式事务管理和声明式事务管理,帮助你理解这两种方式的差异与应用场景。 首先,编程式事务管理依赖于编程的方式显式地控制事务的开始、提交、回滚等操作。它通过实现 `...
本教程将深入探讨如何在Spring中实现自定义事务管理器、编程式事务处理以及声明式事务`@Transactional`的使用。 首先,让我们了解事务管理的基本概念。事务是一组数据库操作,这些操作要么全部执行,要么全部回滚,...
编程式事务管理通常通过AOP(面向切面编程)的TransactionTemplate或PlatformTransactionManager接口直接在代码中控制事务,而声明式事务管理则是基于AOP的,通过配置XML或使用注解来定义事务边界。 1. **配置...
通过学习这一章节,你将能够熟练掌握Spring编程式事务的使用,理解事务管理的核心原理,并能在实际开发中灵活应用。结合提供的"Java开发Java经验技巧共34页.pdf"文档,你将获得更深入的理论知识和实践经验。同时,...
编程式事务管理使用 TransactionTemplate 或者直接使用底层的 PlatformTransactionManager。声明式事务管理有基于 tx 和 aop 名字空间的 xml 配置文件和基于 @Transactional 注解的方式。 为什么使用 Spring 来进行...
当我们谈论“Spring编程式事务”时,这涉及到Spring框架中对数据库事务的管理方式之一。 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理是指在代码中显式地控制事务的开始、提交、...
通过TransactionTemplate或者直接在Service层的方法中使用try-catch-finally结构来管理事务的开始、提交和回滚。这种方式给开发者提供了更多的控制,但可能导致代码中事务管理部分过于繁杂,不易于维护。 **声明式...
在 Spring 中,编程式事务管理是通过使用 Spring 的事务管理接口来实现的。 Spring 的事务管理接口 在 Spring 中,事务管理接口是通过 PlatformTransactionManager 来实现的。这个接口提供了三个方法:begin...
声明式事务管理是通过注解或XML配置来控制事务边界,而编程式事务管理则是在代码中显式调用`TransactionTemplate`或`PlatformTransactionManager`进行控制。 ThreadLocal是Java提供的一种线程局部变量,每个线程都...
声明式事务管理通过配置元数据(如XML或注解)来控制事务边界,而编程式事务管理则通过TransactionTemplate或PlatformTransactionManager接口直接在代码中管理事务。 在描述中提到的博客文章中,作者可能详细讲解了...
Spring 提供了 TransactionTemplate 和 PlatformTransactionManager 接口来支持编程式事务管理。 2. 声明式事务管理:这是 Spring 的一大特色,它允许开发者在配置文件或注解中声明事务的边界,而不必在业务代码中...
编码式事务,也称为编程式事务管理,是指在代码中显式地控制事务的开始、提交、回滚等操作。这种方式虽然灵活,但会增加代码的复杂性和维护难度。下面将详细阐述Spring+MyBatis中的编码式事务管理。 1. **Spring的...
首先,编程式事务管理是通过编写代码来控制事务的开始、提交、回滚以及异常处理。在Spring中,我们通常使用`PlatformTransactionManager`接口及其实现类,如`DataSourceTransactionManager`来管理事务。通过在业务...