- 浏览: 84928 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
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 811java.util.ConcurrentModificatio ... -
Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)
2010-04-15 13:35 1239什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什 ... -
Hibernate HQL查询
2009-07-09 15:32 2046Hibernate HQL查询 参数绑 ... -
editplus 编译 运行 执行 java 类
2009-03-26 16:50 1258关键字: editplus 编译 运行 执行 java 类 ... -
Resin:解决找不到com.sun.tools.javac.Main问题
2009-03-26 14:35 5177java.lang.ClassNotFoundExceptio ... -
Maven2 安装
2009-03-26 10:25 1929Maven2 安装 Maven 是一个构建工 ... -
jar打包详解
2008-10-16 15:51 995为什么会有这个玩意呢 ... -
关于UML 2中结构图的介绍
2008-10-13 11:42 1794关于UML 2中结构图的 ... -
在 Java 中如何进行 BASE64 编码和解码
2008-10-09 09:47 1608BASE64 编码是一种常用的字符编码,在很多地方都会用到。 ... -
几种常见的异常
2008-10-08 17:12 725今天在做项目的时候报了这样一个错,所以我整理一些常见的异常,以 ... -
用PHP和MySQL保存和输出图片
2008-10-08 16:27 1388设置数据库 我们通常在数据库中所使用的文本 ... -
小议lIOC
2008-09-27 12:50 8331.ioc定义 IoC就是Inversion of Co ... -
读取显示当前目录下的文件及目录-java io
2008-09-24 18:04 2557很简单的一个需求,要求读取当前目录下所有的文件和目录,并显示出 ... -
為什么需要內部類
2008-09-24 18:00 768為什么需要內部類?有什么好處呢?感覺不用也沒什么,我也這樣任為 ... -
ext+dwr完整的例子(包括树, 增删改查等)
2008-09-23 08:40 1750---js var UI = function(){ v ... -
一个通用的ProxyMap
2008-09-19 09:23 2403先来一个通用的ProxyMap。如果不需要重用,这个类可以不用 ... -
声明式事务管理
2008-09-18 13:44 1600大多数Spring用户选择声 ... -
spring中使用编程级的事务
2008-09-18 10:56 2400使用org.springframework.transacti ... -
HibernateTemplate中HibernateCallback的事务
2008-09-18 10:42 1739目的:使用HibernateTemplate执行execute ... -
An internal error occurred during: Generating Art
2008-09-16 13:05 2750今天做项目遇到了这样一个问题:An internal erro ...
相关推荐
演示了spring编程式事务的实现,通过TransactionTemplate模板进行事务控制
Spring为了简化事务管理的代码:提供了模板类 TransactionTemplate,所以手动编程的方式来管理事务,只需要使用该模板类即可
编程式主要使用TransactionTemplate。 void add() { transactionTemplate.execute( new TransactionCallback(){ pulic Object doInTransaction(TransactionStatus ts) { //do sth} } } 声明式的比编程式的更灵活。...
9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的...
9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. IBM WebSphere 9.8.2. BEA WebLogic 9.8.3. Oracle OC4J 9.9. 常见问题的解决方法 9.9.1. 对一个特定的 DataSource 使用了错误...
和transactionTemplate(用于编程式事务处理,只用于特殊需要,因为已经存在配置式事务,一般符合命名的方法会自动创建事务) 其他功能: shown工具包 - 图片上传,分页 urlRewrite - 访问地址重定向,用于页面伪...
9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多...
9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. IBM WebSphere 9.8.2. BEA WebLogic 9.8.3. Oracle OC4J 9.9. 常见问题的解决方法 9.9.1. 对一个特定的 DataSource 使用了错误...
9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多...
14.5.5.通过TransactionProxyFactoryObject使用声明式事务 14.5.6. 通过ProxyFactoryObject使用声明式事务 14.5.7. Using Abstract object definitions 14.5.8. Declarative Transactions using ProxyFactoryObject...