`

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

    博客分类:
  • J2SE
阅读更多


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



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

在此种情况下典型的编码方式如下:
Java代码
   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();  
       }  
            
      }  
  }  

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接口。典型的代码如下:


Java代码

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

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编程接口典型的代码如下:
Java代码
   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();  
       }  
             
       }  
   }  

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.
分享到:
评论

相关推荐

    hibernate-jpa-2.1-api-1.0.0.final.jar.zip

    - **配置**: 开发者需要在pom.xml或build.gradle文件中添加`hibernate-jpa-2.1-api-1.0.0.final.jar`依赖,然后在应用配置中指定Hibernate作为JPA提供商。 - **实体类**: 使用@Entity注解标记Java类为JPA实体,并...

    hibernate-jpa.jar

    而Hibernate作为JPA的提供商之一,提供了更为强大的功能和性能优化,使得JPA在实际应用中更具优势。 Hibernate JPA的核心概念包括实体(Entity)、实体管理器(EntityManager)、实体管理工厂...

    hibernate_ jpa.jar

    Hibernate JPA,全称为Java Persistence API,是Java领域中用于管理数据库对象的一种规范,它为Java应用程序提供了统一的ORM(对象关系映射)解决方案。Hibernate作为JPA的一个实现,极大地简化了数据库操作,使得...

    hibernate-jpa

    Hibernate是JPA的一个实现,提供了丰富的功能和灵活性,使得在Java应用中使用JPA更加方便。 **1. Hibernate与JPA的关系:** JPA 是一种规范,定义了如何在Java应用中管理和持久化数据。它为开发者提供了一套API,...

    mysql的驱动包,适合使用hibernate和jpa

    本篇文章将深入探讨MySQL驱动在Hibernate和JPA中的使用,以及为什么选择特定的驱动版本对于避免问题至关重要。 首先,MySQL驱动主要由Java JDBC(Java Database Connectivity)接口提供,它是Java标准版(Java SE)...

    5.Hibernate 05 Hibernate结合JPA1

    在本文中,我们将探讨如何将Hibernate与Java Persistence API (JPA) 结合使用。首先,我们需要了解JPA的基本概念。 **1. 什么是JPA?** Java Persistence API (JPA) 是Java平台上的一个标准接口,它定义了用来管理...

    Hibernate JPA jar包

    Hibernate JPA(Java Persistence API)是Java平台上的一个标准,用于管理和持久化应用程序中的对象。它提供了一种在Java应用和关系数据库之间进行数据映射的方法,使得开发者可以使用面向对象的方式来操作数据库,...

    hibernate+jpa注解实现最简单的增删改查

    在Java开发中,Hibernate和JPA(Java Persistence API)是两种广泛使用的对象关系映射(ORM)框架,它们简化了与数据库交互的过程,使开发者可以使用面向对象的方式来操作数据。本教程将介绍如何使用Hibernate和JPA...

    支持hibernate+jpa开发的jar包

    在Java世界中,Hibernate和Java Persistence API (JPA) 是两个强大的框架,它们极大地简化了对象关系映射(ORM)的过程,使得开发者可以更高效地处理数据库操作。本资源包集合了这些技术所需的核心库,方便开发者的...

    spring+springmvc+hibernate+jpa搭建

    在IT行业中,构建一个基于Spring、SpringMVC、Hibernate和JPA的开发环境是常见的任务,这四个组件都是Java企业级应用开发中的重要工具。让我们深入探讨这些技术以及如何将它们整合在一起搭建一个完整的开发环境。 *...

    springmvc spring hibernate jpa maven 整合

    在本项目中,Spring可能被用来管理Spring MVC中的bean,配置数据源,以及设置Hibernate和JPA的数据访问层。 Hibernate是一个流行的Java持久化框架,它简化了对象-关系映射(ORM)的过程。通过Hibernate,开发者可以...

    hibernate-jpa-2.0-api-1.0.1.Final-sources

    这个源码包"hibernate-jpa-2.0-api-1.0.1.Final-sources"包含了完整的源代码,可以帮助我们深入了解其内部机制,从而更好地应用在实际项目中。 1. **JPA简介**:Java Persistence API(JPA)是Java平台上的一个标准...

    hibernate-jpa学习

    而Java Persistence API (JPA) 是Java EE平台中的一个规范,它定义了如何在Java应用程序中管理和持久化对象。Hibernate是JPA的一个实现,提供了更丰富的功能和更灵活的配置选项。 **1. Hibernate基础** Hibernate的...

    hibernate jpa 入门案例依赖jar

    在Java世界中,Hibernate和Java Persistence API (JPA) 是两个强大的对象关系映射(ORM)框架,它们简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。本篇文章将深入探讨Hibernate JPA入门案例所需的...

    hibernate-jpa-2.1-api 1.0.0.Final API

    Hibernate是Java领域中最受欢迎的对象关系映射(ORM)框架之一,而JPA则是Java平台上的标准 ORM 规范,允许开发者以面向对象的方式处理数据库操作。"API"代表应用程序编程接口,通常是一系列预定义的函数、类和接口...

    hibernate-jpa-2.1-api-1.0.0.Final.jar

    本文将深入探讨`hibernate-jpa-2.1-api-1.0.0.Final.jar`这个库,了解其源码中的关键概念和API,并结合具体应用,阐述如何在实际项目中有效利用这些知识。 首先,Hibernate-JPA 2.1 API 是Hibernate对Java ...

    Hibernate JPA 实例

    【描述】在IT领域,Hibernate是一个广泛使用的对象关系映射(ORM)框架,而Java Persistence API (JPA)是Java平台上的一个标准,用于管理和持久化Java应用程序中的对象。这个实例是关于如何在实际项目中结合使用...

Global site tag (gtag.js) - Google Analytics