`
whp0731
  • 浏览: 174871 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring学习之八--Hibernate编程式事务

阅读更多

采用编程式事务

程序示例:

1、以前单个事物的控制

1)HibernateUtils 工具类

package com.bjsxt.usermgr.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

	private static SessionFactory factory;
	
	static {
		try {
			Configuration cfg = new Configuration().configure();
			factory = cfg.buildSessionFactory();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static SessionFactory getSessionFactory() {
		return factory;
	}
	
	public static Session getSession() {
		return factory.openSession();
	}
	
	public static void closeSession(Session session) {
		if (session != null) {
			if (session.isOpen()) {
				session.close();
			}
		}
	}
}

 2)UserManagerImpl 单个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();
			
			session.save(user);

			Log log = new Log();
			log.setType("安全日志");
			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();
		}finally {
			HibernateUtils.closeSession(session);
		}
	}
}

 

 

2、现在需要对保存用户和日志当作一个事务同时处理

按以前的方法,我在保存日志时需要把user的当前session也一起传递过去

 

现在hebernater3.0以后可以用以下方法:

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();
			
			session.save(user);

			//事物有效性测试,制造异常:Integer.parseInt("asdfsdfsfsd");
			Log log = new Log();
			log.setType("安全日志");
			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();
//		}finally {
//			HibernateUtils.closeSession(session);
		}
	}
}

 

 

3、以上代码中getCurrentSession()与openSession()的区别?
 * 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()
   创建的session则不会
 * 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()
   创建的session必须手动关闭
  
4、使用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编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

    **Hibernate编程式事务管理** Hibernate作为流行的ORM(对象关系映射)框架,提供了对JDBC事务的封装。编程式事务管理允许开发者手动控制事务的边界。以下是一些关键概念: 1. **Session**: Hibernate的核心接口,...

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

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

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

    在本篇“Spring学习笔记(十五)——编程式事务例子”中,我们将深入探讨Spring框架中的编程式事务管理。在实际开发中,我们通常使用声明式事务管理,它基于AOP(面向切面编程)来简化事务处理。然而,有时为了更细...

    spring-orm-hibernate4源码

    5. **事务管理**: Spring支持编程式和声明式事务管理。在Hibernate4中,声明式事务管理通常通过`@Transactional`注解实现,它会由Spring的事务代理处理事务的开始、提交或回滚。 6. **实体映射**: Hibernate使用ORM...

    jsf-spring-hibernate整合

    Spring框架是Java企业级应用开发的基石,它提供了一个全面的基础设施,涵盖了依赖注入、AOP(面向切面编程)、事务管理、数据访问等核心功能。在本项目中,Spring将被用来管理JSF和Hibernate的依赖关系,以及处理...

    Spring框架(spring-framework-5.2.6.RELEASE)的jar包

    - `spring-tx-5.2.6.RELEASE.jar`:事务管理服务,支持编程式和声明式事务处理。 - `spring-web-5.2.6.RELEASE.jar` 和 `spring-webmvc-5.2.6.RELEASE.jar`:Web相关的模块,分别对应基础Web支持和MVC框架。 每个...

    spring hibernate 事务管理学习笔记(二)

    首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理是通过编程的方式来控制事务的开始、提交、回滚等操作,通常使用`TransactionTemplate`或直接调用`...

    Mina-Spring-Hibernate.rar_mina_mina hibernate_spring mina

    Mina作为一个高效的网络通信框架,Spring作为全栈式框架,而Hibernate则是主流的对象关系映射(ORM)框架。将这三个框架进行整合,可以构建出高效、灵活且易于维护的企业级应用。以下将详细介绍Mina、Spring和...

    JSf-Spring-Hibernate整合开发案例教程

    在JSF-Spring-Hibernate整合开发中,Spring作为整体架构的胶水,负责管理JSF组件的生命周期和事务,同时通过其数据源和Hibernate SessionFactory的管理,实现了数据库操作的透明化。JSF处理用户界面的交互,Spring...

    Spring-SpringMVC-Hibernate整合

    Spring还支持数据访问、事务管理、任务调度等多种功能,为整个应用程序提供了一站式解决方案。 **SpringMVC** SpringMVC是Spring框架的一部分,专门用于构建Web应用程序。它遵循MVC设计模式,将业务逻辑(Model)、...

    struts2.3.37+spring-framework-5.1.0+hibernate-release-5.3.1.Final

    4. 整合Spring和Hibernate:使用Spring管理Hibernate的SessionFactory,实现数据访问层(DAO)接口,通过Spring的AOP进行事务管理。 5. 测试和调试:确保各个框架之间的协作无误,进行单元测试和集成测试,确保应用...

    hibernate-release-5.2.10

    5. **事务管理**:Hibernate支持编程式和声明式事务管理,确保数据的一致性。 6. **缓存**:Hibernate内置了二级缓存机制,可以通过配置使用如Ehcache这样的缓存提供者,提高性能。 7. **关联映射**:包括一对一(@...

    struts2-spring-hibernate jar包

    这个"struts2-spring-hibernate jar包"包含了这三个框架的最新版本,为开发者提供了一站式的解决方案,便于快速构建基于Java的Web应用程序。 Struts2是一个基于MVC(Model-View-Controller)设计模式的Web应用框架...

    struts2-spring-hibernate

    Spring是一个全面的Java企业级应用开发框架,它包含了依赖注入(DI)、面向切面编程(AOP)、事务管理等功能。Spring的IOC容器负责管理对象的生命周期和依赖关系,而AOP则允许开发者编写横切关注点,如日志、事务等...

    尚硅谷-佟刚-spring使用的spring-framework-4.0.0.RELEASE

    7. **事务管理**: Spring提供了一套完善的事务管理机制,包括编程式事务管理和声明式事务管理。在Spring-Hibernate集成中,通常使用声明式事务管理,通过@Transactional注解来控制事务的边界。 8. **单元测试和整合...

    Spring之Spring2.5集成Hibernate3.6

    1. **事务管理**:Spring提供了一种统一的事务管理方式,可以在不同数据源上进行声明式或编程式事务控制,使得事务管理更加简单且健壮。 2. **对象持久化**:通过Spring的Hibernate模板或者JPA抽象层,开发者可以...

    Spring Hibernate事务实例

    编程式事务管理需要开发者手动编写事务开始、提交和回滚的代码,而声明式事务管理则通过配置来定义事务边界,更易于维护和使用。 Spring的`TransactionInterceptor`是声明式事务管理的一部分,它基于AOP来处理事务...

    spring-framework-2.5-rc2-with-dependencies\spring-framework-2.5-rc2\spring-framework-2.5-rc2docs

    在事务管理方面,Spring 2.5进一步完善了声明式事务管理,允许开发者通过注解或XML配置来定义事务边界,减少了手动处理事务的复杂性。此外,对JDBC、Hibernate、JPA等多种持久层技术的集成,使Spring成为了数据库...

Global site tag (gtag.js) - Google Analytics