- 浏览: 51360 次
- 性别:
- 来自: 苏州
最新评论
-
237304457:
好东西,firefox debug 的学习
Firebug JavaScrupt JS 调试 -
lc87624:
能麻烦问一下这是转至哪里的文章吗?想看一下全文
JSP处理session与cookie关系(转载)
Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的Transaction实际上是底层的JDBC Transaction的封装,或者是JTA Transaction的封装,下面我们详细的分析:
Hibernate可以配置为JDBCTransaction或者是JTATransaction,这取决于你在hibernate.properties中的配置:
如果你什么都不配置,默认情况下使用JDBCTransaction,如果你配置为:
将使用JTATransaction,不管你准备让Hibernate使用JDBCTransaction,还是JTATransaction,我的忠告就是什么都不配,将让它保持默认状态,如下:
在下面的分析中我会给出原因。
一、JDBC Transaction
看看使用JDBC Transaction的时候我们的代码例子:
这是默认的情况,当你在代码中使用Hibernate的Transaction的时候实际上就是JDBCTransaction。那么JDBCTransaction究竟是什么东西呢?来看看源代码就清楚了:
Hibernate2.0.3源代码中的类
这是启动Transaction的方法,看到 connection().setAutoCommit(false) 了吗?是不是很熟悉?
再来看
这是提交方法,看到connection().commit() 了吗?下面就不用我多说了,这个类代码非常简单易懂,通过阅读使我们明白Hibernate的Transaction都在干了些什么?我现在把用Hibernate写的例子翻译成JDBC,大家就一目了然了:
看明白了吧,Hibernate的JDBCTransaction根本就是conn.commit而已,根本毫无神秘可言,只不过在Hibernate中,Session打开的时候,就会自动conn.setAutoCommit(false),不像一般的JDBC,默认都是true,所以你最后不写commit也没有关系,由于Hibernate已经把AutoCommit给关掉了,所以用Hibernate的时候,你在程序中不写Transaction的话,数据库根本就没有反应。
二、JTATransaction
如果你在EJB中使用Hibernate,或者准备用JTA来管理跨Session的长事务,那么就需要使用JTATransaction,先看一个例子:
这是标准的使用JTA的代码片断,Transaction是跨Session的,它的生命周期比Session要长。如果你在EJB中使用Hibernate,那么是最简单不过的了,你什么Transaction代码统统都不要写了,直接在EJB的部署描述符上配置某某方法是否使用事务就可以了。
现在我们来分析一下JTATransaction的源代码,
看清楚了吗? 和我上面写的代码 tx = new Initial Context?().lookup("javax.transaction.UserTransaction"); 是不是完全一样?
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可以配置为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
发表评论
-
JSP处理session与cookie关系(转载)
2011-08-29 16:12 1584为什么登陆后,只要不关 ... -
Hibernate的检索策略
2011-03-29 16:58 929Hibernate的检索策略包括类级别检索策略和关联级别检索策 ... -
Hibernate, Fetch strategy
2011-03-21 17:50 1261转载 主题:关于hibernate延迟加载的错误解决方案 收 ... -
转:JSON
2010-03-19 09:45 863转自:http://blog.csdn.net/lovehon ... -
Java Class Path
2010-03-12 14:48 3023我们在系统的环境变量里面添加一个新的变量叫 CLASSPATH ... -
Java reference 值传递还是应用传递的 争论
2010-02-26 17:34 1242转载自:http://dreamhead.blogbus.co ... -
JAVA JS JSP HTML
2010-02-26 13:49 1088应该注意前后台的分类: 什么时候把计算放在前台 用js或是其它 ... -
Firebug JavaScrupt JS 调试
2010-02-04 10:27 1303安装就不用说了,很简单,在FireFox上插件库里 ... -
Out of memory Error:JAVA ;Out of memory ;Tomcat; PermGen space
2010-01-25 18:17 2849PermGen space的全称是Permanent Ge ... -
IE 和 FIREFOX 的不同点
2009-12-23 12:50 0IE 和firefox再web前端的 css效果有很多显示的不 ... -
JAVA 内部类的使用
2009-11-26 11:09 1129JAVA 内部类的简单总结 定义在一个类内部的类叫内部类,包含 ... -
IE 和 firefox的区别
2009-11-19 14:53 10631.document.formName.item(itemNa ... -
FireFox 调试工具 firebug的使用
2009-09-22 15:40 8464如何使用firebug进行调试 2009-06-05 18:3 ... -
Forward 和SendRedirect
2009-09-10 08:50 9731.RequestDispatcher.forward() ... -
Servlet 学习笔记
2009-09-08 20:54 920Java Servlet 开发工具(JSDK)提供了多个软件包 ... -
JAVA Final 关键字的使用
2009-09-07 22:28 738一、final 根据程序上下文环境,Java关键字final ... -
Hibernate 1对多双向关联时候的 argument mismatch 问题
2009-08-17 16:26 972今天在hibernate 关联的时候 无意中把 set 写成H ... -
JNDI 原理 以及JBoss Demo
2009-08-13 11:24 3601摘要: 本文详细介绍了JNDI的架构与实现,JNDI ... -
Tomcat context initializeContext().lookup()参数的含义
2009-08-12 17:39 2381经常看到对于jndi的操作 server.xml < ... -
DAO 泛型设计
2009-08-12 11:22 1103泛型是JDK1.5的一个新的特性,使用泛型机制 ...
相关推荐
其次,`jta.jar`则包含Java Transaction API(JTA),这是Java平台标准版(Java EE)的一部分,用于处理分布式事务。在Hibernate中,如果需要进行跨多个资源的事务管理,如同时操作数据库和消息队列,那么JTA就变得...
在现代企业级应用开发中,Spring、Hibernate和Java Transaction API(JTA)是常见的技术组合。Spring作为轻量级的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)框架,提供了丰富的依赖注入和...
本文旨在深入探讨Hibernate事务管理机制,特别是JDBC Transaction与JTA Transaction在Hibernate中的实现方式及其区别。 #### 二、Hibernate事务管理配置 在使用Hibernate进行开发时,可以通过配置`hibernate....
1. **JTA(Java Transaction API)**: 用于管理事务,确保数据一致性。 2. **JPA(Java Persistence API)**: 虽然不是必须,但Hibernate可以作为JPA的实现,因此有时会被一起使用。 3. **CGLIB或ASM**: 用于为...
本文将深入探讨在Eclipse环境中使用Hibernate开发应用程序时涉及到的Transaction管理,特别是JDBC Transaction和JTA(Java Transaction API)Transaction的区别与使用。 首先,Hibernate并不直接提供事务处理功能,...
典型的J2EE三层结构,分为表现层... Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的Transaction实际上是底层的JDBC Transaction的封装,或者是JTA Transaction的封装,
Hibernate提供了两种主要的事务处理模式:JDBC事务管理和JTA事务管理。 - **JDBC事务管理**:这是最基本的事务管理方式,适用于单个应用程序上下文中。它通过设置连接的自动提交属性为`false`来开启事务,并在提交...
Hibernate Transaction提供了与JTA(Java Transaction API)和JDBC事务管理的集成,支持分布式事务处理。开发者可以使用@Transactional注解在方法级别声明事务边界,使事务管理变得简单易行。此外,Hibernate还提供...
在 Hibernate 中,事务管理可以基于 JDBC Transaction 或 JTA (Java Transaction API) 进行,这两种方式各有特点。 首先,Hibernate 默认的事务处理机制是基于 JDBC Transaction。这意味着在进行数据库操作时,...
## the Transaction API abstracts application code from the underlying JTA or JDBC transactions #hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory #hibernate....
3. **`hibernate.transaction.manager_lookup_class`**:定义查找JTA事务管理器的类。 - 示例: ```properties hibernate.transaction.manager_lookup_class=org.hibernate.transaction....
5. **事务管理**:Hibernate支持JTA和JDBC事务管理,为应用程序提供了强大的事务处理能力。 6. **缓存机制**:内置了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的),提高了数据访问速度。 **...
如果你的环境不支持JTA或者更倾向于使用传统的ResourceLocal事务,你可以切换到`org.hibernate.transaction.JDBCTransactionFactory`。 缓存配置也是关键部分,它可以提高性能。Hibernate提供了第一级缓存(Session...
- `hibernate.current_session_context_class`: 当前Session上下文类,可以是`thread`(线程绑定)或`jta`(Java Transaction API)。 4. **日志配置** - `hibernate.show_sql`: 如果设置为`true`,Hibernate将在...
Hibernate支持JTA(Java Transaction API)和本地事务,根据应用环境选择合适的事务管理方式: ```xml <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory...
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory ``` 对于JTA,可以设置为: ```xml <property name="hibernate.transaction.factory_class">org....
在Hibernate中配置JTA事务,需要在`hibernate.cfg.xml`中设置`transaction.factory_class`为`org.hibernate.transaction.JTATransactionFactory`,并确保应用服务器提供JTA支持。使用JTA事务的代码通常涉及与应用...
6. **事务管理**:Hibernate支持JTA(Java Transaction API)和JDBC事务管理。通过`<property name="hibernate.transaction.factory_class">`来选择合适的事务管理器。 7. **其他配置**:还有许多其他可配置的属性...
Hibernate 3.1支持JTA(Java Transaction API)和JPA(Java Persistence API)的事务管理,确保数据的一致性和完整性。同时,内置的二级缓存(Second-Level Cache)可以提高性能,减少对数据库的直接访问。通过配置...
<property name="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory <property name="jta.UserTransaction">java:comp/UserTransaction ``` 最后,关于压缩包中的`hibernate.xml`文件,...