`
mixer_a
  • 浏览: 356941 次
社区版块
存档分类
最新评论

Hibernate事务处理机制--1

阅读更多
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的话,数据库根本就没有反应。
分享到:
评论

相关推荐

    详解Hibernate事务处理机制

    ### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...

    hibernate-release-5.2.10

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

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

    其中,Hibernate作为一款功能强大的ORM框架,极大地简化了Java对象与数据库表之间的映射关系处理。而JPA(Java Persistence API)是Java EE规范的一部分,为ORM提供了标准的接口。`hibernate-jpa-2.1-api-1.0.0....

    hibernate3+ proxool-0.9.1配置 和proxool-0.9.1.jar

    它支持多种数据库,包括MySQL、Oracle、SQL Server等,并且具备事务管理、缓存机制和查询语言HQL(Hibernate Query Language)等特性。 Proxool,全称为Proxy Connection Pool,是一个灵活、轻量级的数据库连接池。...

    Hibernate hibernate-core-1a8aca9.ta

    3. Transaction:事务管理是数据库操作的基础,Hibernate提供了Transaction接口来封装数据库的事务操作,确保数据的一致性和完整性。 4. Query和Criteria:用于执行SQL查询的API,Query基于HQL(Hibernate查询语言...

    hibernate-cglib-repack-2.1_3.jar

    但在Hibernate中,CGLIB主要用于动态代理,生成实体类的子类,从而实现在不修改原有代码的情况下,添加额外的行为,如懒加载、事务管理等。 在Hibernate中,实体类通常会被CGLIB动态代理,生成一个代理对象。当调用...

    Hibernate的事务处理机制和flush方法的用法.docx

    在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些场景下会出现特定的异常。 首先,我们需要了解Hibernate中的事务处理。在Java应用中,事务通常与SessionFactory和Session...

    hibernate-release-5.0.0.Final(1).zip

    Hibernate是Java领域中广泛使用的ORM工具,它允许开发者用面向对象的方式处理数据库操作,降低了数据库访问的复杂性。通过提供一种对象-关系映射机制,Hibernate可以将数据库表映射为Java类,使得数据库操作如同操作...

    hibernate-release-5.2.16.Final.zip

    1. **对象关系映射(ORM)**:Hibernate的核心功能就是通过ORM机制将Java对象与数据库表进行映射,实现了程序代码与数据库结构的解耦,提高了开发效率。 2. **配置文件**:Hibernate的配置文件(hibernate.cfg.xml...

    hibernate-extensions-2.1.3.zip ,middlegen for hibernate

    - Event监听器:允许在特定的持久化操作前后执行自定义逻辑,如事务处理、日志记录等。 - 邮件服务:集成邮件发送功能,实现业务流程中的通知机制。 2. Middlegen: Middlegen是针对Hibernate的一个元数据生成...

    hibernate-release-4.2.4.Final.zip

    9. **事务管理**:Hibernate支持自动和手动的事务管理,可以很好地处理并发和数据一致性问题。开发者可以通过Session的beginTransaction、commit和rollback方法来控制事务的边界。 10. **缓存机制**:Hibernate提供...

    hibernate-release-5.0.7.Final.zip

    Hibernate,作为Java领域中的一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以使用面向对象的方式处理数据库事务。在2016年,传智播客黑马程序员发布的Hibernate教程中,特别选用了...

    hibernate源码release-4.1.4.Final版

    Hibernate提供了save()、update()、merge()和delete()方法来处理对象的持久化状态。其中,save()适合新对象的插入,update()用于已存在对象的更新,merge()则是合并当前对象状态到持久化对象,delete()则删除对象。 ...

    hibernate-orm-master.zip

    六、事务处理 在Hibernate中,事务管理是通过Session的beginTransaction()、commit()和rollback()方法实现的。事务的隔离级别和回滚规则可以根据具体需求进行配置。 七、关联映射 Hibernate支持多种关联映射,包括...

    hibernate-release-4.2.4核心jar包

    这个jar包是使用Hibernate进行开发时必不可少的部分,它定义了Hibernate API,提供了Entity Manager和Session接口,以及对事务处理的支持。 其次,`javassist-3.15.0-GA.jar`是Java编程辅助工具包,它允许在运行时...

    最新 hibernate-release-4.2.13.Final.tgz

    在“hibernate-release-4.2.13.Final”目录下,你会发现一系列的核心jar包,如hibernate-core.jar,它包含了Hibernate的主要功能,包括实体管理、查询API、事务处理等。此外,还有hibernate-entitymanager.jar,专注...

    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-2.1-api-1.0.0.final-sources.jar.zip

    本篇文章将重点围绕“hibernate-jpa-2.1-api-1.0.0.final-sources.jar.zip”这一压缩包,深入解析Hibernate对JPA 2.1 API的实现,以期帮助读者深入理解其内部机制。 JPA(Java Persistence API)是Java平台上的一个...

    hibernate-distribution-3.5.6-Final.rar

    4. 性能优化:此版本对缓存机制进行了优化,提高了查询效率,同时改进了事务处理,降低了数据不一致的风险。 5. Query Language(HQL):Hibernate特有的面向对象的查询语言,允许开发者用类和属性而不是表和列进行...

Global site tag (gtag.js) - Google Analytics