国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

分析Hibernate的事務處理機制

2019-11-17 06:13:39
字體:
來源:轉載
供稿:網友
  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();
...


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日土县| 开封县| 炎陵县| 松阳县| 千阳县| 嘉义县| 烟台市| 博白县| 长丰县| 杭锦旗| 上栗县| 广灵县| 福贡县| 翼城县| 咸丰县| 周宁县| 区。| 海门市| 右玉县| 木兰县| 外汇| 犍为县| 离岛区| 百色市| 区。| 右玉县| 绿春县| 甘南县| 元氏县| 交口县| 柞水县| 桐城市| 锦屏县| 汶川县| 开阳县| 嘉峪关市| 台中县| 邵阳县| 通渭县| 台中市| 青阳县|