`

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

阅读更多
采用编程式事务

事务主要分为:编程式事务和声明式事务

1、SessionFactory.getCurrentSession()和SessionFactory.openSession()的区别?
	* 如果是SessionFactory.getCurrentSession()来创建session,在commit后session就
	  自动关闭了,也就是不用再session.close()了
	* 如果使用的是SessionFactory.openSession()必须显示的关闭session,因为commit后不会关闭
	
	参见:HIBERNATE_HOME/doc/tutorial下的项目
	
2、SessionFactory.getCurrentSession()的配置,需要在hibernate.cfg.xml文件中加入,如下配置:
	*本地事务jdbc事务
		<property name="hibernate.current_session_context_class">thread</property>
	*全局事务jta事务
		<property name="hibernate.current_session_context_class">jta</property>	

 关于Hibernate的编程式事务,我们以增加用户的同时向数据库插入日志为例说明。

主要代码如下:

package com.bjsxt.usermgr;

import com.bjsxt.usermgr.manager.UserManager;
import com.bjsxt.usermgr.manager.UserManagerImpl;
import com.bjsxt.usermgr.model.User;


public class UserMangerTest {
	
	public static void  main(String[] args) {
		User user = new User();
		user.setName("张三");
		
		UserManager userManager = new UserManagerImpl();
		
		userManager.addUser(user);
	}
}

 

package com.bjsxt.usermgr.manager;

import java.util.Date;

import org.hibernate.Session;

import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.model.User;
import com.bjsxt.usermgr.util.HibernateUtils;

public class UserManagerImpl implements UserManager {

	public void addUser(User user) {
		Session session = null;
		try {
			//session = HibernateUtils.getSession();
			session = HibernateUtils.getSessionFactory().getCurrentSession();
			session.beginTransaction();
			
			//持久化user
			session.save(user);
			
			Log log = new Log();
			//log.setType("安全日志");
			log.setType(null);
			log.setDetail("xxx用户尝试登录。。。");
			log.setTime(new Date());
			LogManager logManager = new LogManagerImpl();
			
			logManager.addLog(log);
			
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}
	}
}

 

package com.bjsxt.usermgr.manager;

import org.hibernate.Session;

import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.util.HibernateUtils;

public class LogManagerImpl implements LogManager {

	public void addLog(Log log) {
		Session session = HibernateUtils.getSessionFactory().getCurrentSession();
		session.save(log);
	}

}

 

注意上面我们使用了getCurrentSession,所以没用显式调用closeSession方法关闭session.

当增加用户的时候将插入一条数据到user表,而同时加入一条日志到log表。

那么当log.setType(null);时因为type字段不能为空,所以按编程式事务将不会在user,log表中的任何一个插入数据。即发生回滚。

具体代码见spring_hibernate_1项目。

 

下面我们使用spring的声明式事务来对上面代码进行改进。

显然我们将要集成spring与hibernate.

配置方法:

集成spring和hibernate
	* 把hibernate和spring的包引入
	* 声明式事务的配置
	 --配置SessionFactory
	 --配置事务管理器
     --配置事务的传播特性
     --配置哪些类的哪些方法进行事务管理	
     * 继承HibernateDaoSupport类,使用HibernateTemplate这个类来持久化数据,HibernateTemplate类
        实际上是session的封装
     * 默认回滚异常是RuntimException,即运行时异常,普通异常不回滚
     * 在编写异常时最好一直向上抛出,有呈现层处理
     * spring的事务管理需要添加在业务逻辑方法上,不要添加到DAO上

 

按照上面方法我们对spring_hibernate_1项目进行改进。

首先我们引入spring所需类库:我的自定义spring库里有:spring.jar,log4j-1.2.15.jar, common-logging.jar, aspectjrt.jar, aspectjweaver.jar, cglib-nodep-2.1.3.jar

第二步进行声明式事务的配置:

我们新建一个spring的配置文件applicationContext-common.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:aop="http://www.springframework.org/schema/aop"
		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/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
		
>
	<!-- 配置sessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configLocation">
			<value>classpath:hibernate.cfg.xml</value>
		</property>
	</bean>
	
	<!-- 配置事务管理器 -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
	<!-- 配置事务传播特性 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="add*" propagation="REQUIRED"/>
			<tx:method name="*" read-only="true"/>
		</tx:attributes>
	</tx:advice>
	
	<!-- 配置哪些类的方法进行事务管理 -->
	<aop:config>
		<aop:pointcut expression="execution(* com.bjsxt.usermgr.manager.*.*(..))" id="addManagerMethod"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="addManagerMethod"/>
	</aop:config>
</beans>

 

 

第三步,我们把Dao层UserManagerImpl,LogManagerImpl继承HibernateDaoSupport,并利用getHibernateTemplate方法来获得session,对UserManagerImpl增加属性logManager,并通过ioc设置属性。

package com.bjsxt.usermgr.manager;

import java.util.Date;

import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.model.User;
import com.bjsxt.usermgr.util.HibernateUtils;

public class UserManagerImpl extends HibernateDaoSupport implements UserManager {

	private LogManager logManager;
	
	public void addUser(User user) {
		this.getHibernateTemplate().save(user);
			Log log = new Log();
//			log.setType("安全日志");
			log.setType(null);
			log.setDetail("xxx用户尝试登录。。。");
			log.setTime(new Date());
			
			logManager.addLog(log);
	}
	
	public void setLogManager(LogManager logManager) {
		this.logManager = logManager;
	}
}

 

package com.bjsxt.usermgr.manager;

import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.bjsxt.usermgr.model.Log;
import com.bjsxt.usermgr.util.HibernateUtils;

public class LogManagerImpl  extends HibernateDaoSupport implements LogManager {

	public void addLog(Log log) {
		this.getHibernateTemplate().save(log);
	}

}

 

 

第四步:创建另一个配置文件applicationContext-beans.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:aop="http://www.springframework.org/schema/aop"
		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/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
		
>
	<bean id="logManager" class="com.bjsxt.usermgr.manager.LogManagerImpl">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<bean id="userManager" class="com.bjsxt.usermgr.manager.UserManagerImpl">
		<property name="logManager" ref="logManager"></property>
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
</beans>

 

测试类:

package com.bjsxt.usermgr;

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

import com.bjsxt.usermgr.manager.UserManager;
import com.bjsxt.usermgr.model.User;


public class UserMangerTest {
	
	public static void  main(String[] args) {
		User user = new User();
		user.setName("张三");
		
		ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext-*.xml");
		UserManager userManager = (UserManager)act.getBean("userManager");
		userManager.addUser(user);
	}
}

 

测试插入成功,然后将log.setType("安全日志");改为 log.setType(null);,看是否有事务回滚。

具体代码见spring_hibernate_3.rar

分享到:
评论

相关推荐

    声明式事务控制spring+hibernate集成

    在"声明式事务控制,spring2.5+hibernate3集成源码"中,开发者可以学习如何配置Spring的事务管理器,以及如何在Hibernate的SessionFactory和SessionFactoryBuilder上使用Spring的TransactionProxyFactoryBean来创建...

    Spring与Hibernate集成

    5. **事务管理**: Spring提供了声明式事务管理,可以在配置文件中定义事务管理器,并在需要事务控制的方法上添加`@Transactional`注解。这样,Spring会自动处理事务的开始、提交或回滚。 6. **测试和运行**: 最后,...

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

    本文将深入探讨如何将Spring与Hibernate进行集成,并重点介绍声明式事务的配置与使用。 Spring框架是一个全面的企业级应用开发框架,它提供依赖注入(DI)和面向切面编程(AOP)等功能,简化了Java应用的复杂性。另...

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

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

    SpringAOP整合Hibernate并使用事务

    Spring提供了声明式事务管理,这使得事务管理代码不再需要硬编码到业务逻辑中,而是通过配置来实现。AOP代理可以在方法调用前后自动执行事务相关的操作,如开启、提交、回滚事务,大大提高了代码的整洁度。 3. **...

    Spring2.5和Hibernate3集成--学习spring aop ioc

    Spring2.5和Hibernate3集成 采用声明式事务 1.声明式事务的配置 * 配置sessionFactory * 配置事务管理器 * 配置事务的传播特性 * 配置哪些类哪些方法使用事务 2.编写业务逻辑方法 * 继承...

    Spring AOP管理Hibernate事务(TransactionInSpringAOP)

    编程式事务管理需要开发者显式调用开始、提交、回滚等事务管理API,而声明式事务管理则更简洁,只需要在配置中声明事务属性,由Spring自动处理事务的生命周期。 在Hibernate中,事务通常与数据库连接紧密相关,通过...

    全面分析_Spring_的编程式事务管理及声明式事务管理.

    本篇文章将深入探讨Spring中的两种主要事务管理方式:编程式事务管理和声明式事务管理。 1. 编程式事务管理: 编程式事务管理允许开发者直接在代码中控制事务的开始、提交、回滚等操作。这种方式具有较高的灵活性,...

    Spring及AOP应用(事务与集成)培训

    Spring提供了一种统一的事务管理接口,支持编程式和声明式事务管理。编程式事务管理允许开发者在代码中显式地开始、提交、回滚事务;而声明式事务管理则更简单,通过在方法或类上添加注解,Spring会自动处理事务的...

    spring,hibernate整合实现事务管理(MethodInterceptor)

    标题中的“spring,hibernate整合实现事务管理(MethodInterceptor)”是指在Java开发中,使用Spring框架与Hibernate ORM框架进行集成,以实现应用的事务管理。Spring以其强大的依赖注入(DI)和面向切面编程(AOP)...

    spring基于AOP实现事务

    总结一下,Spring基于AOP实现的事务管理通过TransactionProxyFactoryBean,结合声明式事务配置,能够提供一种高效且易于维护的事务解决方案。它允许我们在不修改业务逻辑的情况下,统一管理和控制事务,提升了代码的...

    spring学习笔记(十五)-编程式事务例子

    在实际开发中,我们通常使用声明式事务管理,它基于AOP(面向切面编程)来简化事务处理。然而,有时为了更细粒度的控制或者在特定场景下,我们可能需要采用编程式事务管理。 首先,了解事务的四大特性(ACID)是必...

    Spring Hibernate事务实例

    本教程将深入探讨如何在Spring框架中利用`TransactionInterceptor`进行声明式事务管理,与Hibernate集成实现高效的数据库事务控制。 首先,了解事务管理是至关重要的。事务是一组数据库操作,这些操作要么全部成功...

    Spring+Hibernate注解事务实例

    本实例将深入探讨如何结合Spring的注解声明式事务管理与Hibernate的数据访问技术,构建一个完整的事务处理系统。 Spring框架以其灵活的依赖注入(DI)和面向切面编程(AOP)闻名,它允许开发者将事务管理从业务逻辑...

    Spring2 Hibernate3集成

    1. **事务管理**:Spring提供了一套声明式事务管理机制,可以方便地与Hibernate等持久层技术结合使用,实现细粒度的事务控制。 2. **对象关系映射**:Hibernate通过配置文件或注解的方式定义实体类与数据库表之间的...

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

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

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

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

Global site tag (gtag.js) - Google Analytics