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

Hibernate JDBCTransaction JTATransaction

阅读更多
Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的Transaction实际上是底层的JDBC Transaction的封装,或者是JTA Transaction的封装,下面我们详细的分析:
  
  Hibernate可以配置为JDBCTransaction或者是JTATransaction,这取决于你在hibernate.properties中的配置:
  
  #hibernate.transaction.factory_class
  net.sf.hibernate.transaction.JTATransactionFactory
  #hibernate.transaction.factory_class
  net.sf.hibernate.transaction.JDBCTransactionFactory

  
  如果你什么都不配置,默认情况下使用JDBCTransaction,如果你配置为:
  
  hibernate.transaction.factory_class
  net.sf.hibernate.transaction.JTATransactionFactory
  

  将使用JTATransaction,不管你准备让Hibernate使用JDBCTransaction,还是JTATransaction,我的忠告就是什么都不配,将让它保持默认状态,如下:
  
  #hibernate.transaction.factory_class
  net.sf.hibernate.transaction.JTATransactionFactory
  #hibernate.transaction.factory_class
  net.sf.hibernate.transaction.JDBCTransactionFactory

  
  在下面的分析中我会给出原因。
  
  一、JDBC Transaction
  
  看看使用JDBC Transaction的时候我们的代码例子:
  
 
 Session session = sf.openSession();
  Transaction tx = session.beginTransactioin();
  ...
  session.flush();
  tx.commit();
  session.close();

  
  这是默认的情况,当你在代码中使用Hibernate的Transaction的时候实际上就是JDBCTransaction。那么JDBCTransaction究竟是什么东西呢?来看看源代码就清楚了:
  
  Hibernate2.0.3源代码中的类
  
  net.sf.hibernate.transaction.JDBCTransaction:
  
  public void begin() throws HibernateException {
  ...
  if (toggleAutoCommit) session.connection().setAutoCommit(false);
  ...
  }

  
  这是启动Transaction的方法,看到 connection().setAutoCommit(false) 了吗?是不是很熟悉?
  
  再来看
  
  public void commit() throws HibernateException {
  ...
  try {
  if ( session.getFlushMode()!=FlushMode.NEVER ) session.flush();
  try {
  session.connection().commit();
  committed = true;
  }
  ...
  toggleAutoCommit();
  }

  
  这是提交方法,看到connection().commit() 了吗?下面就不用我多说了,这个类代码非常简单易懂,通过阅读使我们明白Hibernate的Transaction都在干了些什么?我现在把用Hibernate写的例子翻译成JDBC,大家就一目了然了:
  
  Connection conn = ...; <--- session = sf.openSession();
  conn.setAutoCommit(false); <--- tx = session.beginTransactioin();
  ... <--- ...
  conn.commit(); <--- tx.commit(); (对应左边的两句)
  conn.setAutoCommit(true);
  conn.close(); <--- session.close();
  

  看明白了吧,Hibernate的JDBCTransaction根本就是conn.commit而已,根本毫无神秘可言,只不过在Hibernate中,Session打开的时候,就会自动conn.setAutoCommit(false),不像一般的JDBC,默认都是true,所以你最后不写commit也没有关系,由于Hibernate已经把AutoCommit给关掉了,所以用Hibernate的时候,你在程序中不写Transaction的话,数据库根本就没有反应。
  
  二、JTATransaction
  
  如果你在EJB中使用Hibernate,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTATransaction,先看一个例子:
  
 
 javax.transaction.UserTransaction tx = new
  InitialContext().lookup("javax.transaction.UserTransaction");
  Session s1 = sf.openSession();
  ...
  s1.flush();
  s1.close();
  ...
  Session s2 = sf.openSession();
  ...
  s2.flush();
  s2.close();
  tx.commit();
  

  这是标准的使用JTA的代码片断,Transaction是跨Session的,它的生命周期比Session要长。如果你在EJB中使用Hibernate,那么是最简单不过的了,你什么Transaction代码统统都不要写了,直接在EJB的部署描述符上配置某某方法是否使用事务就可以了。
  
  现在我们来分析一下JTATransaction的源代码,
net.sf.hibernate.transaction.JTATransaction:
  
  public void begin(InitialContext context, ...
  ...
  ut = (UserTransaction) context.lookup(utName);
  ...
  

  看清楚了吗? 和我上面写的代码 tx = new Initial Context?().lookup("javax.transaction.UserTransaction"); 是不是完全一样?
  
 
 public void commit() ...
  ...
  if (newTransaction) ut.commit();
  ...
  

  JTATransaction的控制稍微复杂,不过仍然可以很清楚的看出来Hibernate是如何封装JTA的Transaction代码的。
  
  但是你现在是否看到了什么问题? 仔细想一下,Hibernate Transaction是从Session中获得的,tx = session.beginTransaction(),最后要先提交tx,然后再session.close,这完全符合JDBC的Transaction的操作顺序,但是这个顺序是和JTA的Transactioin操作顺序彻底矛盾的!!! JTA是先启动Transaction,然后启动Session,关闭Session,最后提交Transaction,因此当你使用JTA的Transaction的时候,那么就千万不要使用Hibernate的Transaction,而是应该像我上面的JTA的代码片断那样使用才行。
  
  总结:
  
  1、在JDBC上使用Hibernate 必须写上Hibernate Transaction代码,否则数据库没有反应。此时Hibernate的Transaction就是Connection.commit而已
  
  2、在JTA上使用Hibernate 写JTA的Transaction代码,不要写Hibernate的Transaction代码,否则程序会报错
  
  3、在EJB上使用Hibernate 什么Transactioin代码都不要写,在EJB的部署描述符里面配置
  
  |---CMT(Container Managed Transaction)
  |
  |---BMT(Bean Managed Transaction)
  |
  |----JDBC Transaction
  |
  |----JTA Transaction
分享到:
评论

相关推荐

    hibernate jdbc需要用的jar

    其次,`jta.jar`则包含Java Transaction API(JTA),这是Java平台标准版(Java EE)的一部分,用于处理分布式事务。在Hibernate中,如果需要进行跨多个资源的事务管理,如同时操作数据库和消息队列,那么JTA就变得...

    spring+hibernate+jta demo

    在现代企业级应用开发中,Spring、Hibernate和Java Transaction API(JTA)是常见的技术组合。Spring作为轻量级的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)框架,提供了丰富的依赖注入和...

    Hibernate入门

    本文旨在深入探讨Hibernate事务管理机制,特别是JDBC Transaction与JTA Transaction在Hibernate中的实现方式及其区别。 #### 二、Hibernate事务管理配置 在使用Hibernate进行开发时,可以通过配置`hibernate....

    hibernate所需包:hibernate3,依赖包,JDBC

    1. **JTA(Java Transaction API)**: 用于管理事务,确保数据一致性。 2. **JPA(Java Persistence API)**: 虽然不是必须,但Hibernate可以作为JPA的实现,因此有时会被一起使用。 3. **CGLIB或ASM**: 用于为...

    Eclipse开发Hibernate应用程序

    本文将深入探讨在Eclipse环境中使用Hibernate开发应用程序时涉及到的Transaction管理,特别是JDBC Transaction和JTA(Java Transaction API)Transaction的区别与使用。 首先,Hibernate并不直接提供事务处理功能,...

    SSH框架优点及事务说明

    典型的J2EE三层结构,分为表现层... Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的Transaction实际上是底层的JDBC Transaction的封装,或者是JTA Transaction的封装,

    详解Hibernate事务处理机制

    Hibernate提供了两种主要的事务处理模式:JDBC事务管理和JTA事务管理。 - **JDBC事务管理**:这是最基本的事务管理方式,适用于单个应用程序上下文中。它通过设置连接的自动提交属性为`false`来开启事务,并在提交...

    软件依赖包(Spring AOP+Hibernate Transaction)

    Hibernate Transaction提供了与JTA(Java Transaction API)和JDBC事务管理的集成,支持分布式事务处理。开发者可以使用@Transactional注解在方法级别声明事务边界,使事务管理变得简单易行。此外,Hibernate还提供...

    Hibernate事务

    在 Hibernate 中,事务管理可以基于 JDBC Transaction 或 JTA (Java Transaction API) 进行,这两种方式各有特点。 首先,Hibernate 默认的事务处理机制是基于 JDBC Transaction。这意味着在进行数据库操作时,...

    hibernate.properties

    ## the Transaction API abstracts application code from the underlying JTA or JDBC transactions #hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory #hibernate....

    hibernate配置参数大全

    3. **`hibernate.transaction.manager_lookup_class`**:定义查找JTA事务管理器的类。 - 示例: ```properties hibernate.transaction.manager_lookup_class=org.hibernate.transaction....

    搭建hibernate所使用的jar包,内含mysql的jdbc的jar包

    5. **事务管理**:Hibernate支持JTA和JDBC事务管理,为应用程序提供了强大的事务处理能力。 6. **缓存机制**:内置了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的),提高了数据访问速度。 **...

    hibernate--5.Hibernate配置文件详解-2

    如果你的环境不支持JTA或者更倾向于使用传统的ResourceLocal事务,你可以切换到`org.hibernate.transaction.JDBCTransactionFactory`。 缓存配置也是关键部分,它可以提高性能。Hibernate提供了第一级缓存(Session...

    Hibernate核心配置文件对照表

    - `hibernate.current_session_context_class`: 当前Session上下文类,可以是`thread`(线程绑定)或`jta`(Java Transaction API)。 4. **日志配置** - `hibernate.show_sql`: 如果设置为`true`,Hibernate将在...

    oracle的hibernate配置文件

    Hibernate支持JTA(Java Transaction API)和本地事务,根据应用环境选择合适的事务管理方式: ```xml &lt;property name="hibernate.transaction.factory_class"&gt;org.hibernate.transaction.JDBCTransactionFactory...

    hibernate事务

    &lt;property name="hibernate.transaction.factory_class"&gt;org.hibernate.transaction.JDBCTransactionFactory ``` 对于JTA,可以设置为: ```xml &lt;property name="hibernate.transaction.factory_class"&gt;org....

    Hibernate事务和并发控制

    在Hibernate中配置JTA事务,需要在`hibernate.cfg.xml`中设置`transaction.factory_class`为`org.hibernate.transaction.JTATransactionFactory`,并确保应用服务器提供JTA支持。使用JTA事务的代码通常涉及与应用...

    Hibernate程序的配置文件

    6. **事务管理**:Hibernate支持JTA(Java Transaction API)和JDBC事务管理。通过`&lt;property name="hibernate.transaction.factory_class"&gt;`来选择合适的事务管理器。 7. **其他配置**:还有许多其他可配置的属性...

    hibernate3.1

    Hibernate 3.1支持JTA(Java Transaction API)和JPA(Java Persistence API)的事务管理,确保数据的一致性和完整性。同时,内置的二级缓存(Second-Level Cache)可以提高性能,减少对数据库的直接访问。通过配置...

    hibernate_esb配置

    &lt;property name="transaction.factory_class"&gt;org.hibernate.transaction.JTATransactionFactory &lt;property name="jta.UserTransaction"&gt;java:comp/UserTransaction ``` 最后,关于压缩包中的`hibernate.xml`文件,...

Global site tag (gtag.js) - Google Analytics