簡體   English   中英

Hibernate錯誤“數據庫被鎖定”。我如何正確關閉會話?

[英]Hibernate error “database is locked”. How do i correctly close session?

在我的應用程序中,我打開會話,創建標准,但不要關閉它。 然后在其他方法中我再次打開會話,更新對象和接收database is lockedtr.commit()

如果我把session.close()放在我接收的第一個實例中

無法初始化代理 - 沒有會話。

如何正確關閉和打開會話? 或者我是否需要將代理對象復制到我創建的那些對象然后close()

Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tr=session.beginTransaction();

        Criteria criteria = session.createCriteria(MyDocument.class);
        criteria.add(Expression.like("isMainDoc", 1));

        List docs = criteria.list();

        tr.commit();
        session.close();

我是一個完全的乞丐。 我使用sqlite。 任何幫助,將不勝感激。 提前致謝。

Hibernate Session通常與線程相關聯。

因此,也許您應該重新構建代碼以在處理開始時獲取會話(例如,在Web應用程序的ServletFilter實例中)。

然后在每個方法中,您可以使用相同的會話對象來啟動新事務(當然,也可以結束事務)。

public void doWork(){
  Transaction tx = null;
   try{
     tx = session.beginTransaction();  
   }catch(){
   } finally {
     // if tx != null then.. close transaction, or rollback?
   }
}

編輯:然后回來,在處理完成后關閉會話(在web-app中,也可以在同一個ServletFilter中)Google:“Open Session In View”模式。

原因

當您嘗試訪問查詢返回的MyDocument類實例的屬性時,可能會收到錯誤。

Hibernate默認是懶惰的。 它會返回一個對象的proxy ,而不是在訪問引用屬性時訪問數據庫。 只要需要, 就可以覆蓋此行為。 永遠記住無法初始化代理 - 當代碼嘗試訪問proxy屬性(通過訪問數據庫)並發現會話不可用時,不會收到會話(當Hibernate使用此接口訪問數據庫時需要會話)

每當Hibernate嘗試加載尚未加載的對象時,請確保您的會話處於打開狀態。 你是怎樣做的?

(簡單來說)Hibernate中有兩種思想流派:

  1. 在關閉Session OR之前獲取您可能訪問的所有數據
  2. 在處理對象的整個持續時間內保持會話打開。

我希望你刷一些主題,比如Hibernate中的工作單元。 Hibernate提供了一個很好的界面來定義數據庫訪問的邊界。 必須在這些邊界之間訪問(讀/寫)數據。 檢查一下

hibernate.current_session_context_class配置中的hibernate.current_session_context_class可以取值jta | 線程| 管理| custom.Class。 此變量定義Session的工作單元。

最后但最重要的是嘗試使用Contextual Sessions (您必須遇到.getCurrentSession() ,它可以幫助您獲得在代碼中隨時隨地打開相同會話 .getCurrentSession()處理幕后的一切。

希望這個答案可以作為指導您使用Hibernate的正確途徑,而不僅僅是解決這個特定的問題。

使用hibernate事務時,請按照以下步驟閱讀此處的API。

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

//Or any other operation.
session.save(a);

tx.commit();
session.close();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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