`

事务在Hibernate以及JPA中的应用(一)

阅读更多

作者:狂放不羁
网址:http://yuquan-nana.iteye.com

>>>转载请注明出处!<<<

 

前篇文章总结了最基础的事务的概念。现在就总结一下具体事务在JavaEE持久层的应用。具体分为两部分,第一部分是事务在Hibernate 中的应用,第二部分是在JPA中的应用。下面先总结一下,事务在Hiernate里的应用。

 

首先需要声明的是,hibernate本身没有事务功能。它只是借助JDBC事务,或者JTA事务来实现事务的管理,它只是封装了事务的使用方法。一般事务控制定界到service层,但是为了方便,以下的代码将事务代码放在Dao层。事务在Hiibernate中的应用具体可以分为一下三部分:

 

1 JDBC事务在Hibernate的应用。如果我们系统不需要分布式的话,那么就可以采用JDBC事务来提供事务服务。要想在Hibernate里使用JDBC事务,我们必须要配置如下属性:hibernate.transaction.factory_class=org.hiberante.transaction.JDBCTransactionFactory.

在此种情况下典型的编码方式如下:

public class XXXDao ...{
	
	Session session ;
	Transaction tx ;

	public void crudOperation(){
	
	try{
	
		session = HibernateUtil.getCurrentSession();
		tx = session.beginTransaction();
		//完成具体的CRUD操作。
		tx.commit();
	
	}catch(RuntimeException e){
	
		tx.rollback();
	}finally{
	
		this.getSession().close();
	}
		
	}
}

 在此种情况下,Hibernate的数据库连接可以由容器来管理,也可以自己管理一个数据库连接池,并且只有当事务开始的时候才获得connection.需要注意的是,tx.beginTransaction(),此语句实际上是将获得connection的自动提交模式关闭,也就是connection.setAutoCommit(false)。

 

2 JTA事务在Hibernate中的应用。如果要想使用JTA事务提供的分布式事务服务,那么必须要做以下事情:

 首先,需要确保相对应的JDBC驱动程序支持XAResource接口,因为只有支持此接口的JDBC Driver才能纳入JTA事务管理器的管理。

 其次,需要更改配置如下:

hibernate.transaction.factory_class=org.hiberante.transaction.JTATransactionFactory.

hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup.(此配置根据自己的JavaEE AS来配置).

确保以上两个条件后,就需要考虑选择JTA provider了,是选择JavaEE服务器来提供JTA服务呢,还是通过开源的JTA组件来提供服务。如果采用开源的组件的话,可以采用如JBoss的JTA组件等。如果采用JavaEE服务器的话,则可以直接受益与Application server提供的JTA服务了。

需要注意的是在这种情况下,hibernate不再管理数据库连接池了,它需要通过JNDI来获取JTA提供者暴漏的连接池服务。

在此种模式下,编程模型可以采用如下两种:

1)利用hibernate的Transaction接口。典型的代码如下:

 

public class XXXDao ...{
	
	Session session ;
	Transaction tx ;

	public void crudOperation(){
	
	try{
	
		session = HibernateUtil.getCurrentSession();
		tx = session.beginTransaction();
		//完成具体的CRUD操作。
		tx.commit();
	
	}catch(RuntimeException e){
	
		tx.rollback();
	}finally{
	
		this.getSession().close();
	}
		
	}
}

 如果采用Hibernate的原生接口的话,那么不需要应用程序flush session和关闭session了,因为在模型下,hibernate内部会在事务提交的时候自动flush和close session.但是这样做不好的地方就是将应用程序绑定到hiberante原生(Native)接口,不便于系统的移植,所以为了方便系统移植,以及将事务服务的提供留给应用程序部署者来完成,我们可以采用standard JTA接口。JTA编程接口典型的代码如下:

public class XXXDao ...{
	
	Session session ;
	UserTransaction utx = (UserTransaction)ServiceLocator.getUserTransaction("JNDIName") ;

	public void crudOperation(){
	
	try{
	
	  utx.begin():
		session = HibernateUtil.getCurrentSession();
		
		//完成具体的CRUD操作。
		utx.commit();
		session.flush();//此时需要程序来flush session
	
	}catch(RuntimeException e){
	
		utx.rollback();
		//日志记录等
	}finally{
	
		this.getSession().close();
	}
		
	}
}

 

 此时值得注意的时,需要应用程序来刷新session,如果想要激活自动刷新和自动关闭session的功能,需要配置如下两个属性:

* hibernate.transaction.flush_before_completion和hibernate.transaction.auto_close_session为true.这样以来当JTA事务提交和回滚的时候Hibernate就会自动刷新和关闭session.

 

如果觉得以上代码不够美观的话,那是正常的,因为代码中充斥着try,catch语句,以及将事务处理的代码侵入到了业务代码中。如何避免这些烦人的try ,catch语句,以及事务处理代码,就需要比较流行的AOP来解决。如果采用AOP的话,建议采用现成的AOP框架来实现,比如spring就支持hibernate的声明式事务管理,当然也可以采用代理等模式来自己实现,看系统需要和个人爱好。

 

3.采用容器管理事务(CMT).如果采用JavaEE AS的话,我们就可以直接使用EJB容器提供的声明式事务管理功能了。在此种模式下,其实底层事务还是JTA,不过事务控制是由容器来控制,应用程序只需要负责业务核心就OK了。如果采用CMT的话,可以通过session bean来封装 hibernate session,这样可以通过EJB的Annotation来注解业务方法,这样以来就不需要我们关心事务代码了,只需要配置支持XA 标准的数据源就好了。不过此时的事务工厂类要配置为CMTTransactionFactory.

 

未完待续........

3
1
分享到:
评论

相关推荐

    spring-jpa-hibernate:使用Spring Data JPA和Hibernate作为JPA提供者的示例应用程序

    示例应用程序演示了如何将Hibernate用作Spring Data JPA的JPA提供程序。 当前演示了以下概念: 概念 描述 看 Spring Data JPA存储库 使用再次执行操作关系数据库 直接EntityManager访问 直接访问JPA ...

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

    所使用的应用服务器是jboss 5.1和weblogic 11g,详细介绍了这两种应用服务器的安装和使用,以及如何在两大主流服务器上安装、部署java ee应用。  本书内容主要包括三部分,第一部分介绍java ee开发的基础知识,...

    Hibernate实战(第2版 中文高清版)

     10.1.2 Hibernate应用程序中的事务   10.1.3 使用Java Persistence的事务   10.2 控制并发访问   10.2.1 理解数据库级并发   10.2.2 乐观并发控制   10.2.3 获得额外的隔离性保证   10.3 非事务数据...

    hibernate缓存

    Hibernate提供了两级缓存,第一级是Session的缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务

    JAVA中spring介绍以及个人使用心得

    事务管理:Spring框架提供了强大的事务管理支持,可以通过编程式事务管理或声明式事务管理来管理应用程序中的事务。 MVC框架:Spring框架提供了一个灵活的MVC框架,可以帮助开发人员构建Web应用程序。该框架支持...

    vertx-spring-data:Spring Data(JPA、MongoDB 等)的 vertx mod

    顶点弹簧数据Spring Data(JPA、MongoDB 等)的 Vertx mod ###mod-spring-data 这个允许您在 Vert.x 应用程序中使用 Spring Data,从而可以直接使用 JPA、MongoDB 等。 ###Sample applications 提供了示例以展示如何...

    Spring入门

    简单的ppt和例子。1、轻松实现软件各层之间的解耦:利用依赖注入技术,降低组件之间的耦合度。...6、 Spring对于主流的应用框架提供了集成支持,如:集成Hibernate、JPA、Struts2等,更便于应用的开发。

    基于SpringMVC+Hibernate4的考勤管理系统+.zip

    hibernate-jpa-2.1-api-1.0.0.Final.jar hibernate-validator-5.1.3.Final.jar hibernate-validator-annotation-processor-5.1.3.Final.jar jandex-1.1.0.Final.jar javassist-3.18.1-GA.jar jboss-logging-3.1.3.GA...

    hibernate-search

    使用Hibernate Search特定注释和它可以从现有Hibernate / JPA映射中收集的知识的组合,将对象映射到索引是声明性的。 可以通过以下任意组合定义查询: “本地” Apache Lucene查询以Json格式编写“本机” Elastic...

    J2EE应用开发详解

    37 3.5 动态代理 39 3.6 反射机制在Hibernate中的应用 42 3.7 小结 46 第4章 Servlet技术 47 4.1 Servlet简介 47 4.1.1 Servlet的特点 47 4.1.2 Servlet的优势 48 4.1.3 Servlet的工作过程 49 4.1.4 Servlet的生命...

    Spring面试题

    1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 2. 二级缓存: a) 应用及缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键...

    JAVA程序开发大全---上半部分

    本书系统全面地介绍了Java中的各项主流技术,以及基于这些技术的商业化应用程序的开发技巧,在讲解过程中以目前最为流行的开发工具MyEclipse为载体,全面系统地介绍了如何在MyEclipse中开发基于Struts、Hibernate、...

    Spring in Action(第二版 中文高清版).part2

    16.4.4 在JSF中暴露应用程序环境 16.5 Spring中带有DWR的支持Ajax的应用程序 16.5.1 直接Web远程控制 16.5.2 访问Spring管理的Bean DWR 16.6 小结 附录A 装配Spring A.1 下载Spring A.1.1 研究Spring发布 A...

    Spring in Action(第二版 中文高清版).part1

    16.4.4 在JSF中暴露应用程序环境 16.5 Spring中带有DWR的支持Ajax的应用程序 16.5.1 直接Web远程控制 16.5.2 访问Spring管理的Bean DWR 16.6 小结 附录A 装配Spring A.1 下载Spring A.1.1 研究Spring发布 A...

    基于Java班级管理系统(系统+使用说明+源码)

    班级管理系统是一个帮助教师和学校管理人员管理学生信息、成绩、考勤、课程表和其他班级相关事务的软件。该系统旨在简化教师和管理人员的工作流程,提高班级管理的效率。 功能模块 学生信息管理:添加、删除、修改...

    Spring in Action(第2版)中文版

    16.4.4在jsf中暴露应用程序环境 16.5spring中带有dwr的支持ajax的应用程序 16.5.1直接web远程控制 16.5.2访问spring管理的beandwr 16.6小结 附录a装配spring a.1下载spring a.1.1研究spring发布 a.1.2构建...

    精通Spring(清晰书签版

    第3篇介绍DAO层集成技术,主要围绕JDBC、Hibernate和JPA等持久化技术展开论述,针对Spring使能应用的事务管理和集成测试,也进行了相关介绍;第4篇介绍Java EE服务及技术的集成,主要围绕企业应用中使用的各种Java ...

    spring-boot-crud-api:支持在rest api上执行crud操作的Spring Boot应用程序

    弹簧启动-crud-api ... spring data jpa(EmployeeRepository)-要使用它:扩展接口中的jpaRepository,然后在服务实现中为该接口创建一个字段,该字段将通过构造函数注入进行分配。 不需要限定词和事务性的。

    SpringSOAP_Gradle_JPA_JMS:使用Gradle,SpringBoot,Spring SOAP,JPA,JMS技术的教育项目

    ------------- JPA ------------------------------- Spring Boot Postgresql错误 ------------------- JTA ------------------------------ --- Java Transaction API 1.3规范 事务性Java EE 7教程 由JTA的资深...

    java必了解的六大问题

    *第十五阶段:Spring框架的学习,三大框架之一,包括了IOC,AOP,DataSource,事务,SSH集成以及JPA集成; *最后呢,还有些java的技术,包括EJB3.0等,可以选择学习,与三大轻量级框架相比,EJB就是当之无愧的重量...

Global site tag (gtag.js) - Google Analytics