全国免费热线:
>开发框架之Hibernate事务处理机制
作者:中国IT实验室 点击:12162次 日期:2012-09-15
字号::T | T
    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]  

发表评论

昵称 * 验证码 * 验证码
上一篇: >eclipse中文本编辑器的换行
下一篇: >Java对象校验框架之Oval

资质证书

CMMI Ⅲ APPRAISAL ID:30062
ISO9001:08915Q20090ROS
ISO27001:04817I20037R0S
高新技术企业:GR201753000141

电子商务三位一体发展战略

技术研发

业务培训

实战运营

战略布局

彩票51---093彩票网址_欢迎您 彩票51_官网 彩票51-093彩票网址 彩票51_安全购彩 彩票51|官方唯一指定! 彩票51-登录网