技术中心

这里象征着我们的态度和能力

>开发框架之Hibernate事务处理机制
作者:中国IT实验室    来源:中国IT实验室    发布时间:2012-09-15      浏览次数:9855
分享到:
欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入
    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的话,数据库根本就没有反应。

[1] [2] 下一页

4000-880-989
(24小时热线)
联系客服
微信公众号

官方公众号

小程序

©2008-2022 CORPORATION ALL Rights Reserved. 昆明奥远科技有限公司版权所有 滇ICP备09003328号-1 滇公网安备 53011102000818号
昆明那家网络公司好,新媒体运营,网站优化,网络推广,网站建设,网页设计,网站设计,网站推广,云南网站公司,昆明新媒体公司,云南网红主播,昆明SEO公司,昆明网站建设,昆明网络推广,昆明网站优化,昆明网站推广,红河网站建设,大理网络公司,曲靖网络公司,丽江网站设计,昭通网络公司,保山大数据服务,智慧高速建设,智慧校园服务,云南IDC服务商,网络安全测评,等保测评,网站关键词排名优化服务,服务客户尽超2000余家,一切尽在奥远科技,服务电话:13888956730