`

spring进行声明式事务管理(annotation)

 
阅读更多

在使用注解的时候,首先得在配置文件bean.xml中添加命名空间:

xmlns:tx="http://www.springframework.org/schema/tx"

 

然后在xsi:schemaLocation中添加:

http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd

 

再次引入事务管理者:

<tx:annotation-driven transaction-manager="txManager"/>

 

bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	
	<context:component-scan base-package="com.test"></context:component-scan>
	
	<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
	    <property name="url" value="jdbc:oracle:thin:@localhost:1521:oralsb"/>
	    <property name="username" value="scott"/>
	    <property name="password" value="tiger"/>
	</bean>
	
	<!-- annotation版 -->
	<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
	    <property name="dataSource" ref="myDataSource"/>
		<property name="annotatedClasses">
			<list>
	        	<value>com.test.model.User</value>
	        	<value>com.test.model.Log</value>
			</list>
	    </property>
	    <property name="hibernateProperties">
	    	<props>
		        <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</prop>
		        <prop key="hibernate.show_sql">true</prop>
		        <prop key="hibernate.format_sql">true</prop>
<!--		        <prop key="hibernate.hbm2ddl.auto">create</prop>-->
		    </props>
	    </property>
	</bean>
	  
	<!-- 定义事务管理者 --> 
	<tx:annotation-driven transaction-manager="txManager"/>
	  
	<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="mySessionFactory" />
	</bean>
	
</beans>

 

实体类

User.java

package com.test.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="t_user")
public class User {

	private int id;
	private String name;

	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

 

Log.java

package com.test.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "t_log")
public class Log {

	private int id;
	private String message;

	@Id
	@GeneratedValue
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

}

 

接口

UserDAO.java

package com.test.dao;

import com.test.model.User;

public interface UserDAO {
	public void save(User user);
}

 

LogDAO.java

package com.test.dao;

import com.test.model.Log;

public interface LogDAO {
	public void save(Log log);
}

 

实现接口类

UserDAOImpl.java

package com.test.dao.impl;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Component;

import com.test.dao.UserDAO;
import com.test.model.User;

@Component("userDAOImpl")
public class UserDAOImpl implements UserDAO {

	private SessionFactory sessionFactory;

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	
	@Resource
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	public void save(User user) {
		Session session = sessionFactory.getCurrentSession();
		session.save(user);
	}
}

 

LogDAOImpl.java

package com.test.dao.impl;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Component;

import com.test.dao.LogDAO;
import com.test.model.Log;

@Component("logDAOImpl")
public class LogDAOImpl implements LogDAO {

	private SessionFactory sessionFactory;

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	@Resource
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	public void save(Log log) {
		Session session = sessionFactory.getCurrentSession();
		session.save(log);
		// spring默认RuntimeException的情况下事务会回滚
		// throw new RuntimeException("exception!");
	}
}

 

服务类

UserService.java

package com.test.service;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.test.dao.LogDAO;
import com.test.dao.UserDAO;
import com.test.model.Log;
import com.test.model.User;

@Component("userService")
public class UserService {
	private UserDAO userDAO;
	private LogDAO logDAO;

	/**
	 * 事务的传播特性:
	 * 1.propagation默认值就是REQUIRED,表示在当前的环境中,别的地方调用这个方法,如果已经有了transaction,就用原来这个
	 * ,如果没有,就创建一个transaction(常用)。
	 * 2.propagation值为MANDATORY,表示在当前的环境中,别的地方调用这个方法必须有transaction,否则就报错。
	 * 3.propagation值为NESTED
	 * ,相当于在原来的transaction中内嵌了一个transaction,别的地方调用这个方法,原来的transaction暂停,创建一个保存点
	 * ,方法新起一个transaction,执行完了,原来的transaction继续,内嵌的transaction如果回滚了,
	 * 就会回滚到原来transaction的保存点(用的很少)
	 * 4.propagation值为NEVER,表示在当前的环境中,别的地方调用这个方法不能有transaction,否则就报错。
	 * 5.propagation值为NOT_SUPPORTED
	 * ,表示在当前的环境中,别的地方调用这个方法不能有transaction,否则先挂起原来的transaction
	 */
	@Transactional(propagation = Propagation.REQUIRED)
	public void add(User user) {
		userDAO.save(user);
		Log log = new Log();
		log.setMessage("user save success!");
		logDAO.save(log);
	}

	public UserDAO getUserDAO() {
		return userDAO;
	}

	// 这里会找注解Component的值为:userDAOImpl的那个类
	@Resource(name = "userDAOImpl")
	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}

	public LogDAO getLogDAO() {
		return logDAO;
	}

	@Resource(name = "logDAOImpl")
	public void setLogDAO(LogDAO logDAO) {
		this.logDAO = logDAO;
	}

}

 

Junit测试类

UserServiceTest.java

package com.test.service;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.test.model.User;

public class UserServiceTest {

	@Test
	public void testAdd() throws Exception {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
		UserService service = (UserService) applicationContext.getBean("userService");
		User u = new User();
		u.setName("张三");
		service.add(u);
	}

}

 

分享到:
评论

相关推荐

    使用Spring的声明式事务----Annotation注解方式

    这是Spring声明式事务的核心注解,可以用于类或方法级别。当应用于类时,该类的所有公共方法都将包含在事务中。若应用于方法,只有该方法及其子方法才会被事务管理。注解中的属性包括`propagation`(事务传播行为)...

    spring声明式事务管理配置方式

    在"spring声明式事务管理配置方式"中,主要涉及到以下几个关键知识点: 1. **Spring事务管理器(Transaction Manager)**: - Spring支持多种事务管理器,如DataSourceTransactionManager(用于JDBC事务)和...

    spring3、 hibernate4 配置声明式事务管理(annotation方式)

    本篇将详细介绍如何在Spring 3和Hibernate 4中配置声明式事务管理,采用注解方式。 一、Spring的事务管理 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用...

    spring3,hibernate4 配置声明式事务管理(annotation方式)

    本篇将详细介绍如何在Spring 3和Hibernate 4中通过注解来实现声明式事务管理。 首先,我们需要在项目中引入Spring和Hibernate的依赖库。这通常通过Maven或Gradle等构建工具完成,确保添加了相应的依赖项。 接着,...

    spring+mybatis的声明式事务

    标签"声明式事务"表明我们将重点讨论的是Spring的声明式事务管理。在Spring中,声明式事务主要通过AOP(面向切面编程)实现,它允许我们在不修改业务代码的情况下,通过XML配置或Java配置,以及注解来控制事务的...

    Spring声明式事务配置管理方法

    以下是关于Spring声明式事务配置管理的详细说明: 1. **事务管理器配置**: 在`/WEB-INF/applicationContext.xml`文件中,我们需要定义一个事务管理器Bean。通常,对于Hibernate,我们会使用`...

    实验 spring 声明事务

    实验 "Spring 声明事务" ...通过这个实验,学生可以深入理解Spring声明式事务管理的工作原理,以及如何在实际项目中配置和使用。这将有助于他们在未来开发中更好地处理事务相关的复杂问题,确保应用程序的数据一致性。

    spring声明式事务处理demo

    在这个"spring声明式事务处理demo"中,我们将探讨如何在MyEclipse环境下实现这一功能。 首先,我们要理解Spring事务管理的两种主要方式:编程式事务管理和声明式事务管理。编程式事务管理通常通过AOP(面向切面编程...

    spring3+hibernate4配置声明式事务管理(annotation方式)

    本实例工程展示了如何在Spring 3和Hibernate 4中使用注解进行声明式事务管理,这是一种高效且易于维护的方法。接下来,我们将详细讨论相关知识点。 1. **Spring框架**:Spring是一个全面的后端开发框架,它提供了...

    Spring3配置声明式事务

    Spring框架提供了两种事务管理方式:编程式事务管理和声明式事务管理。其中声明式事务管理通过配置来实现事务管理,大大简化了代码量,提高了开发效率。在Spring3中,配置声明式事务变得更为简便,只需几行配置文件...

    Xml文件配置实现声明式事务管理

    在Spring框架中,声明式事务管理是一种非常重要的特性,它允许开发者通过XML配置或注解来定义事务的边界,而无需在业务代码中显式地管理事务。这种方式极大地提高了代码的可读性和可维护性。本篇文章将深入探讨如何...

    基于java的企业级应用开发:声明式事务管理.ppt

    在Spring框架中,声明式事务管理是实现事务控制的重要手段,它使得开发者无需在代码中显式地管理事务,极大地提高了代码的可维护性和可读性。本篇内容主要涉及两种声明式事务管理方式:基于XML和基于Annotation。 1...

    Spring使用XML配置声明式事务

    在Spring框架中,声明式事务管理是实现事务处理...在博文"Spring使用XML配置声明式事务"中,作者详细讲解了每个步骤,并可能通过示例代码展示了如何实际应用这些配置,帮助读者更好地理解和掌握Spring声明式事务管理。

    spring声明式事务.zip

    本文将深入探讨Spring声明式事务的实现机制、优缺点以及如何在实际项目中进行配置和使用。 1. **声明式事务管理概述** 声明式事务管理与编程式事务管理相对,后者需要开发者在代码中显式调用开始、提交、回滚等...

    Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring AOP的声明式事务。 首先,让我们理解Spring与Hibernate的集成。为了整合这两个库,你需要在Spring配置文件中定义Hibernate的...

    spring+ibatis声明式事务Demo

    当我们谈论"spring+ibatis声明式事务Demo"时,我们关注的是如何在Spring框架中利用iBatis实现声明式事务管理。 声明式事务管理是Spring框架提供的一种方便、高效的方式,使得开发者无需手动控制事务的开始、提交、...

    Spring 常用 Transaction Annotation

    本篇主要聚焦于"Spring 常用 Transaction Annotation",即声明式事务管理,这是一种更简洁、易于维护的事务控制方式。 首先,Spring的声明式事务管理基于AOP(面向切面编程),它允许我们在不修改业务代码的情况下...

    Spring 事务 (二) Spring 声明式事务 配置

    本文主要探讨Spring声明式事务管理的配置,这是Spring提供的一种简便的事务管理方式,允许开发者在不编写任何事务管理代码的情况下实现事务控制。这种方式极大地提高了代码的可维护性和可读性。 首先,我们要理解...

    Spring与Hibernate集成---声明式事务

    接下来,为了启用声明式事务管理,我们通常会在Spring的配置文件中添加`&lt;tx:annotation-driven&gt;`元素,这样Spring会自动扫描带有特定事务注解(如@Transactional)的方法,并根据注解的属性来管理事务。 ```xml ...

    注解实现声明式事务管理

    在Spring框架中,注解是实现声明式事务管理的主要手段之一。相较于编程式事务管理,声明式事务管理更易于维护,因为事务管理的逻辑被声明在配置或元数据中,而不是散落在业务代码中。本篇文章将深入探讨如何使用注解...

Global site tag (gtag.js) - Google Analytics