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());
}
}
以上主函数中的五个测试均成功。
分享到:
相关推荐
总的来说,`TransactionTemplate`为Spring编程式事务提供了一种简洁、可复用的解决方案。通过它,开发者可以在不牺牲事务控制灵活性的同时,避免过多的事务管理代码侵入业务逻辑。然而,在实际应用中,应当根据项目...
3. **TransactionTemplate**: Spring提供的一个工具类,简化了编程式事务管理的代码,使得我们可以专注于业务逻辑而不是事务控制。通过设置TransactionDefinition和执行execute方法,我们可以在一个回调函数中编写...
编程式事务管理允许开发者通过代码来精确控制事务的边界,而`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`来管理事务。通过在业务...