一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Hibernate入門之事務管理

 WindySky 2007-07-15
事務管理
 事務是一組原子操作(一組SQL執(zhí)行)的工作單元,這個工作單元中的所有原子操作在進行期間,與其它事務隔離,免于數(shù)據(jù)源的交相更新而發(fā)生混亂,事務中的所有原子操作,要嘛全部執(zhí)行成功,要嘛全部失?。词怪挥幸粋€失敗,所有的原子操作也要全部撤消)。
 在JDBC中,可以用Connection來管理事務,可以將Connection的AutoCommit設定為false,在下達一連串的SQL語句后,自行呼叫Connection的commit()來送出變更,如果中間發(fā)生錯誤,則撤消所有的執(zhí)行,例如:
try {
.....
connection.setAutoCommit(false);
.....

// 一連串SQL操作

connection.commit();
} catch(Exception) {
// 發(fā)生錯誤,撤消所有變更
connection.rollback();
}
 Hibernate本身沒有事務管理功能,它依賴于JDBC或JTA的事務管理功能,預設是使用JDBC事務管理,事實上,下面的程序只是對JDBC事務管理作了個簡單的封裝:
try {
session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
....

tx.commit();
} catch(Exception e) {
tx.rollback();
}
 在執(zhí)行openSession()時,實際上Hibernate是在開啟一個Connection,而執(zhí)行beginTransaction()時,實際上會執(zhí)行Connection的setAutoCommit(false)方法,最后的tx.commit()就是呼叫Connection的 commit()方法,有興趣的話,可以研究net.sf.hibernate.transaction.JDBCTransaction中的begin ()與commit()方法,可以找到對應的JDBC代碼。
session = sessionFactory.openSession(); <-- Connection connection = ....;
tx = session.beginTransactioin(); <-- connection.setAutoCommit(false);
tx.commit(); <-- connection.commit();
session.close(); <-- connection.close();
 所以使用JDBC事務管理,最后一定要執(zhí)行Transaction的commit(),如果沒有,則之前對session所下的所有指令并不會有效果。
 Hibernate可以透過配置文件來使用基于JTA的事務管理,JTA事務管理可以跨越數(shù)個Session,而不是像JDBC事務管理只能在一個Session中進行,我們在hibernate.cfg.xml中如下撰寫:
<hibernate-configuration>
<session-factory>
....
<property name="hibernate.transaction.factory_class">
net.sf.hibernate.transaction.JTATransactionFactory
</property>
....
</session-factory>
</hibernate-configuration>
 或者是在hibernate.properties中撰寫:
hibernate.transaction.factory_class=net.sf.hibernate.transaction.JTATransactionFactory
 JTA的事務是由JTA容器管理,而不是像JDBC事務管理一樣由Connection來管理事務,所以我們不是由Session來開始事務,而是如下進行:
javax.transaction.UserTransaction tx = new InitialContext().lookup("javax.transaction.UserTransaction");

Session s1 = sessionFactory.openSession();
.... // 一些save、update等
s1.flush();
s1.close();

...

Session s2 = sf.openSession();
...
s2.flush();
s2.close();

....

tx.commit();
 同樣的,如果您有興趣,可以看net.sf.hibernate.transaction.JTATransaction中的begin()與commit()方法代碼,看看Hibernate如何封裝JTA的事務管理代碼的。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美日韩在线第一页日韩| 欧美精品女同一区二区| 免费久久一级欧美特大黄孕妇| 国产91人妻精品一区二区三区| 亚洲天堂男人在线观看| 久久精视频免费视频观看| 国产精品欧美激情在线观看| 国产综合欧美日韩在线精品| 成年午夜在线免费视频| 午夜福利视频日本一区| 午夜色午夜视频之日本| 色偷偷偷拍视频在线观看| 亚洲国产成人av毛片国产| 99久久精品国产日本| 高清亚洲精品中文字幕乱码| 久热香蕉精品视频在线播放| 国产精品成人一区二区三区夜夜夜 | 精品国产亚洲av成人一区| 欧美成人黄色一区二区三区| 免费性欧美重口味黄色| 少妇人妻精品一区二区三区| 国产户外勾引精品露出一区| 老司机精品视频在线免费看| 欧美一本在线免费观看| 欧美日韩国产午夜福利| 日韩视频在线观看成人| 中文字幕av诱惑一区二区| 成人精品欧美一级乱黄| 国产不卡视频一区在线| 99久热只有精品视频免费看| 国产日韩综合一区在线观看| 亚洲精品中文字幕在线视频| 日韩成人免费性生活视频| 亚洲最新一区二区三区| 91偷拍视频久久精品| 少妇激情在线免费观看| 九九热精品视频免费观看| 国产精品亚洲一级av第二区| 99久久成人精品国产免费| 深夜少妇一区二区三区| 国产在线一区中文字幕 |