[英]Hibernate error “database is locked”. How do i correctly close session?
在我的應用程序中,我打開會話,創建標准,但不要關閉它。 然后在其他方法中我再次打開會話,更新對象和接收database is locked
在tr.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中有兩種思想流派:
我希望你刷一些主題,比如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.