`
Jason(aijun)
  • 浏览: 84928 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring中编程式事务处理(使用TransactionTemplate)

    博客分类:
  • J2EE
阅读更多
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());
}
}

以上主函数中的五个测试均成功。
分享到:
评论

相关推荐

    spring编程式事务实现

    演示了spring编程式事务的实现,通过TransactionTemplate模板进行事务控制

    spring_tx编程式事务代码

    Spring为了简化事务管理的代码:提供了模板类 TransactionTemplate,所以手动编程的方式来管理事务,只需要使用该模板类即可

    Spring事务原理、Spring事务配置的五种方式

    编程式主要使用TransactionTemplate。 void add() { transactionTemplate.execute( new TransactionCallback(){ pulic Object doInTransaction(TransactionStatus ts) { //do sth} } } 声明式的比编程式的更灵活。...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的...

    Spring中文帮助文档

    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 使用了错误...

    springMVC + Hibernate 工程模板

    和transactionTemplate(用于编程式事务处理,只用于特殊需要,因为已经存在配置式事务,一般符合命名的方法会自动创建事务) 其他功能: shown工具包 - 图片上传,分页 urlRewrite - 访问地址重定向,用于页面伪...

    Spring 2.0 开发参考手册

    9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多...

    Spring API

    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 使用了错误...

    spring chm文档

    9.7. 选择编程式事务管理还是声明式事务管理 9.8. 与特定应用服务器集成 9.8.1. BEA WebLogic 9.8.2. IBM WebSphere 9.9. 公共问题的解决方案 9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多...

    spring.net中文手册在线版

    14.5.5.通过TransactionProxyFactoryObject使用声明式事务 14.5.6. 通过ProxyFactoryObject使用声明式事务 14.5.7. Using Abstract object definitions 14.5.8. Declarative Transactions using ProxyFactoryObject...

Global site tag (gtag.js) - Google Analytics