`

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);
	}

}

 

分享到:
评论

相关推荐

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

    使用@Transactional注解时,可以通过参数配置事务详情: 5.2.2 基于Annotation方式的声明式事务 * * * * * * * * 声明式事务管理 如何实现Spring的声明式事务管理? 5.2 声明式事务管理 Spring的声明式事务管理可以...

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

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

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

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

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

    一个小实例工程,说的是spring3+hibernate4配置声明式事务管理(annotation方式)

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

    NULL 博文链接:https://tonl.iteye.com/blog/2093289

    Spring JDBC与事务管理

    其操作流程是获取书的单价-&gt;买书(更新库存)-&gt;更新账户余额,在BookShopDaoImp中实现该方法,并使用基于XML和Annotation的声明式事务管理来确保该购书过程能正常执行(这时(1)中的方法都不需进行合法性判断,...

    JavaEE的Spring JDBC与事务管理 实验

    其操作流程是获取书的单价-&gt;买书(更新库存)-&gt;更新账户余额,在BookShopDaoImp中实现该方法,并使用基于XML和Annotation的声明式事务管理来确保该购书过程能正常执行(这时(1)中的方法都不需进行合法性判断,...

    Spring JDBC与事务管理源代码

    1、掌握Spring JDBC的配置; 2、掌握JdbcTemplae类中增删改查方法的使用; 3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式;...5、掌握基于XML和Annotation的声明式事务管理的使用。

    Spring中文帮助文档

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...

    Spring API

    9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.7. 事务传播 9.5.8. 通知...

    Spring.3.x企业应用开发实战(完整版).part2

    9.6 使用注解配置声明式事务 9.6.1 使用@Transactional注解 9.6.2 通过AspectJ LTW引入事务切面 9.7 集成特定的应用服务器 9.7.1 BEA WebLogic 9.7.2 BEA WebLogic 9.8 小结 第10章 Spring的事务管理难点剖析 10.1 ...

    Spring3.x企业应用开发实战(完整版) part1

    9.6 使用注解配置声明式事务 9.6.1 使用@Transactional注解 9.6.2 通过AspectJ LTW引入事务切面 9.7 集成特定的应用服务器 9.7.1 BEA WebLogic 9.7.2 BEA WebLogic 9.8 小结 第10章 Spring的事务管理难点剖析 10.1 ...

    流程管理系统,rbac,dwr

    利用Spring的AOP来做声明式事务,利用Spring的Annotation方式基本达到了零配置,持久层全部使用Hibernate Annotation方式,主要采用的是标准的JPA注解,这样减少了大量的Hibernate映射文件,提高了可维护性,Java与...

    低清版 大型门户网站是这样炼成的.pdf

    6.3.1 spring 2.5的声明式事务管理 394 6.3.2 基于xml方式的事务管理配置 396 6.3.3 基于annotation方式的事务管理配置 400 6.4 “桃园三结义”——ssh 2组合开发框架始成 404 6.4.1 spring 2.5集成orm中间件...

    OA项目SSH整合框架

    2,配置声明式事务(使用基于注解的方式) 1,配置 &lt;!-- 配置事务管理器 --&gt; &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    第4章 利用JDBC和JTA访问 数据库和管理全局事务 178 4.1 JDBC和容器管理的数据源 179 4.1.1 JDBC概述 179 4.1.2 使用JDBC执行数据库访问 180 4.1.3 使用WebLogic服务器管理的 数据源 182 4.1.4 使用JBoss服务器管理...

Global site tag (gtag.js) - Google Analytics