[英]What is the difference between a session and a transaction in JPA 2.0?
我剛剛開始我的JPA 2.0研究,我有這段代碼:
em = SessionFactory.startSession();
tx = em.getTransaction();
我的問題是:我不確定我是否完全理解使用會話和使用事務之間的區別。 在幾行中,有誰能告訴我他們之間最大的區別? 謝謝 !
你去銀行存入2張支票,並提取一筆小額款項。
所以你排隊直到櫃員打開。
你先付款。
然后你的第二個。
然后你退出。
現在你完成了,你離開了櫃員線。
到達出納員就像創建會話,現在你在銀行,准備工作。
每次存款和取款都是他們自己包含的工作,這些都是您的交易。
當您完成工作並離開時,您正在關閉或放棄您的會話。
所以,從本質上說,一個會話包含你的交易,畢竟如果你從未去過銀行,你就不能進行銀行存款嗎?
em = SessionFactory.startSession();
在JPA中,沒有Session,也沒有SessionFactory。 SessionFactory是一個特定於hibernate的接口,如果你使用JPA就不應該使用它(使用Hibernate自己的API或者使用Hibernate作為JPA Provider,但不能同時使用兩者。)
會話是您用於與數據庫交互的內容。
事務用於指定要在其中操作的會話的邊界。
實質上,事務通過僅允許會話一次與其進行交互來防止數據庫被破壞。 (它有點復雜,因為你可以從數據庫中讀取許多事務,但只有一個事務正在編寫。)
在Hibernate中,事務管理非常標准,只記得Hibernate拋出的任何異常都是FATAL,你必須回滾事務並立即關閉當前會話。
這是一個Hibernate事務模板:
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSessionFactory().openSession();
tx = session.beginTransaction();
tx.setTimeout(5);
//doSomething(session);
tx.commit();
}catch(RuntimeException e){
try{
tx.rollback();
}catch(RuntimeException rbe){
log.error("Couldn’t roll back transaction", rbe);
}
throw e;
}finally{
if(session!=null){
session.close();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.