`
wlh269
  • 浏览: 455681 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring(十二) Spring和Hibernate的结合--手动事务管理

阅读更多
=======在没有使用Spring声明式事物前,使用Hibernate手动事务管理========

1、getCurrentSession()和openSession()的区别
* 采用getCurrentSession()方法创建的session会绑定到当前线程中
  而采用openSession()方法创建的session不会绑定到当前线程中
* 采用getCurrentSession()创建的session会在commit或rollback后自动关闭而采用openSession()方法创建的session必须手动关闭
2、使用getCurrentSession()必须在hibernate.cfg.xml文件中进行配置
* 如果采用的是本地事务(JDBC事务)
    <property  name="hibernate.current_session_context_class">thread</property>
* 如果采用的是全局事务(JTA事务)
<property name="hibernate.current_session_context_class">jta</property>

代码如下:

添加一个用户然后,在同一个事务范围内记录日志,如果不成功则回滚!

1.模型部分
package com.wlh.hibernate.model;
import java.util.Date;
//日志
public class Log {

	private int id;
	private String type;
	private String details;
	private Date date;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getDetails() {
		return details;
	}
	public void setDetails(String details) {
		this.details = details;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}
}




package com.wlh.hibernate.model;
//用户
public class User {
  private int id;
  private String username;
public int getId() {
	return id;
}
public void setId(int id) {
	this.id = id;
}
public String getUsername() {
	return username;
}
public void setUsername(String username) {
	this.username = username;
}
}



映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >

<class name="com.wlh.hibernate.model.Log" table="t_log">
  <id name="id" >
   <generator class="native"/>
  </id>
  <property name="type"/>
  <property name="details"/>
  <property name="date"/>
</class>
</hibernate-mapping>


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >

<class name="com.wlh.hibernate.model.User" table="t_user">
  <id name="id" >
   <generator class="native"/>
  </id>
  <property name="username"/>
</class>


</hibernate-mapping>


2.业务逻辑层接口

package com.wlh.hibernate.manager;

import com.wlh.hibernate.model.Log;
//日志管理
public interface LogManager {
  
	public void addLog(Log log);
}

package com.wlh.hibernate.manager;

import com.wlh.hibernate.model.User;
//用户管理
public interface UserManager {
 public void addUser(User user);
}





3.业务逻辑层接口实现

package com.wlh.hibernate.manager.impl;

import com.wlh.hibernate.manager.LogManager;
import com.wlh.hibernate.model.Log;
import com.wlh.hibernate.utils.HibernateUtils;

public class LogManagerImpl implements LogManager {

	public void addLog( Log log) {
		HibernateUtils.getFactory().getCurrentSession().save(log);

	}

}


package com.wlh.hibernate.manager.impl;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.wlh.hibernate.manager.LogManager;
import com.wlh.hibernate.manager.UserManager;
import com.wlh.hibernate.model.Log;
import com.wlh.hibernate.model.User;
import com.wlh.hibernate.utils.HibernateUtils;

public class UserManagerImpl implements UserManager {
      Session session=null;
      Transaction tx=null;
	public void addUser(User user) {
		try{
			 //得到当前一个session然后放到threadLocale中,在事务关闭之前可以在项目的任何地方,
			 //使用sessionFactory.getCurrentSession()得到该Session,不需要传递
			session= HibernateUtils.getFactory().getCurrentSession();
			tx=session.beginTransaction();
			session.save(user);
			
			Log log=new Log();
			log.setDate(new Date());
			log.setDetails("XXXX做了什么XXXX");
			log.setType("操作日志");
			LogManager logManager=new LogManagerImpl();
			logManager.addLog(log);
			
                          //出现异常,事务自动回滚,数据库没有添加记录		          //Integer.parseInt("dfjdkfhdjhjfd");
			tx.commit();
		}catch(Exception e){
			e.printStackTrace();
			tx.rollback();
		}
		
	}

}




4.客户端调用

package com.wlh.hibernate;

import com.wlh.hibernate.manager.UserManager;
import com.wlh.hibernate.manager.impl.UserManagerImpl;
import com.wlh.hibernate.model.User;

public class Client {
	public static void main(String []args){
	UserManager userManager= new UserManagerImpl(); 
	User user=new User();
	user.setUsername("wlh");
	userManager.addUser(user);
  }
}





5.结果输出

Hibernate:
    insert
    into
        t_user
        (username)
    values
        (?)
Hibernate:
    insert
    into
        t_log
        (type, details, date)
    values
        (?, ?, ?)
分享到:
评论

相关推荐

    spring分别与jdbc和hibernate结合的事务控制--案例

    在Spring中,我们可以使用HibernateTemplate或SessionFactoryBean来配置和管理Hibernate。同样,Spring的声明式事务管理也可以应用到Hibernate上,只需将@Transactional注解添加到使用Hibernate的方法上,Spring就会...

    spring-hibernate-maven-transaction整合

    声明式事务管理只需在配置文件中指定哪些方法需要在事务中执行,而编程式事务管理则需要在代码中手动开启和提交事务。Spring支持JDBC、Hibernate等多种数据访问技术的事务管理,提供了一致的API。 整合过程: 1. *...

    Spring Hibernate事务实例

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

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

    你可以参考这个博客链接(https://microjava.iteye.com/blog/525973),结合实际项目,逐步掌握Spring和Hibernate整合的事务管理技巧。 总之,Spring与Hibernate的整合使得Java应用的事务管理变得更加高效和便捷。...

    hibernate-release-4.2.3

    4. 支持事务:Hibernate内置了事务管理,可以无缝地与Java EE或Spring等框架集成,确保数据一致性。 5. 异构数据库支持:Hibernate支持多种数据库,如MySQL、Oracle、PostgreSQL等,具备良好的数据库无关性。 四、...

    Spring之Spring2.5集成Hibernate3.6

    这篇博客“Spring之Spring2.5集成Hibernate3.6”主要探讨了如何将两个经典的开源框架——Spring 2.5和Hibernate 3.6进行整合,以实现数据持久化的高效管理。 Spring 2.5版本是Spring框架的一个重要里程碑,它引入了...

    Hibernate缓存与spring事务详解

    本篇文章将深入探讨Hibernate的缓存机制和Spring的事务管理,以帮助开发者更好地理解和利用这两个强大的工具。 **一、Hibernate缓存** 1. **第一级缓存:Session缓存** - Hibernate的每个Session都有一个内置的...

    spring3.0+hibernate3.3+mysql8.0

    在Spring框架中,我们可以利用Spring的HibernateTemplate或SessionFactoryBean来配置和管理Hibernate,以实现数据持久化。 **MySQL 8.0** 是一个开源的关系型数据库管理系统,以其高性能、稳定性及易用性而闻名。...

    hibernate5--2.数据持久化及事务

    在EJB、Spring等容器中,可以配置使用JTA事务,无需手动管理事务的开始和结束。 **编程式事务管理:** 在非容器环境中,可以使用try-catch-finally结构来手动控制事务的边界。 **3. 事务的隔离级别** 在并发环境...

    spring-mybatis-hibernate-jar包

    在实际项目中,这三者常常一起使用,Spring作为整体的框架管理器,负责协调MyBatis和Hibernate的事务、初始化和配置。MyBatis可以作为SQL查询的工具,提供灵活的SQL编写和映射,而Hibernate则适用于更复杂的对象...

    SpringAOP整合Hibernate并使用事务

    将Spring与Hibernate整合并使用事务管理,能进一步提升应用的稳定性和效率。下面我们将详细讲解如何进行Spring AOP整合Hibernate以及如何在其中使用事务。 1. **Spring AOP简介** 面向切面编程(AOP)是Spring框架...

    Spring整合Hibernate案例

    Spring以其强大的依赖注入和管理能力,结合Hibernate的数据库操作功能,可以构建出优雅且可维护的Java应用。 1. **Spring与Hibernate简介** - Spring是一个全面的后端开发框架,提供了AOP(面向切面编程)、DI...

    Spring事务管理Demo

    1. 配置事务管理器:在Spring的XML配置文件中,根据数据库类型(如JDBC、Hibernate、MyBatis等)配置相应的事务管理器。 2. 开启事务:使用`@Transactional`注解标记需要在事务中执行的方法。 3. 业务逻辑:在事务中...

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

    在Hibernate中,你可以使用`Session`对象的`beginTransaction()`、`commit()`和`rollback()`方法来手动管理事务。例如,在一个业务服务方法中,你会先调用`beginTransaction()`,然后执行数据库操作,最后根据操作...

    spring和hibernate框架

    3. 整合 Spring 和 Hibernate:在 Spring 配置文件中声明 Hibernate 的 SessionFactory Bean,并使用 Spring 的事务管理器来控制事务。 4. 实体类和数据库表映射:使用 Hibernate 的注解或 XML 映射文件,将 Java 类...

    spring管理struts和hibernate

    通过以上步骤,我们不仅可以让Spring有效地管理Struts,实现更灵活的业务逻辑控制,还可以利用Spring的强大功能管理Hibernate,提高数据访问层的开发效率和维护性。这样的整合方式不仅简化了开发流程,还提高了系统...

    spring+Hibernate开发文档

    Spring的IoC容器负责管理对象的生命周期和相互依赖关系,使得开发者无需手动创建和管理对象。此外,Spring还提供了数据访问抽象、Web MVC框架、事务管理、任务调度等多种功能,能够满足复杂的企业级应用需求。 ...

    spring-hibernate3.jar.zip

    代码层面,我们可以利用Spring的JdbcTemplate或者HibernateTemplate来简化数据库操作,它们提供了事务边界内的操作方法,避免了手动管理事务的繁琐。对于复杂的业务逻辑,Spring的DAO层和Service层设计模式可以帮助...

    Maven整合Spring+SpringMVC+Hibernate+SpringDataJPA

    这个组合通常被称为"SSM",其中"M"代表Maven,"S"代表Spring,包括Spring核心框架、Spring MVC和Spring Data JPA,而"H"则代表Hibernate,是一个流行的ORM(对象关系映射)框架。让我们详细探讨这些组件以及它们如何...

Global site tag (gtag.js) - Google Analytics