簡體   English   中英

JPA 2.0中的會話和事務有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM