2013-09-30 85 views
5

我使用hibernate 4.2.4與JPA和layz加載在ManyToMany關聯。 對象A與@ManyToMany(targetEntity=B.class, fetch=FetchType.LAZY)相關聯,並且相反。爲了從數據庫中,我調用下面(簡化)的代碼數據:休眠會話處理與延遲加載

try { 
    session = cutSessionFactory.openSession(); 
    session.beginTransaction(); 
    List<IBO> result = session.createQuery(query).list(); 
    session.getTransaction().commit(); 
    return result; 
catch{...} 
finally{ 
    session.close; 
} 

本來我用來讓開放的連接,因爲如果我的應用程序需要做一些延遲加載,仍然需要該會話的第一個電話之後。但是,雖然這使我的應用程序在執行某些操作後被凍結,但我偶然採用了之前的策略。現在一切正常;沒有凍結,延遲加載沒有問題。 但如果我加載一個實體,它有一些兒童(即requieres延遲加載)的日誌說:其次

2013-09-25 09:35:30 - INFO - BasicResourcePool: A checked-out resource is overdue, and will be destroyed: [email protected] 
2013-09-25 09:35:30 - INFO - BasicResourcePool: Logging the stack trace by which the overdue resource was checked-out 

這是有道理的,Hibernate是不關閉會話

WARN - AbstractPersistentCollection: Unable to close temporary session used to load lazy collection associated to no session

(實際上我認爲有一個使用新會話的延遲加載的新請求),連接池可以識別出有一個未使用的會話。但最終,hibernate正在修復我的「糟糕的會話處理」。

那麼有沒有人知道更好的方式來處理與延遲加載使用的會話?

+0

沒有ü找到一個回答?當你看到這個警告時,連接(來自c3p0)是否關閉?或者是否存在連接池泄漏? – OhadR

回答

0

當然,我們需要關閉會話,否則應用程序可能無法正常工作。

此外,我們應該嘗試保持嵌套對象惰性以獲得更好的性能並添加強制連接。

如果您需要訪問你要申請查詢加入,讓懶惰的對象將被裝載如子元素:

class A{ 
     B b; 
} 

SQL:

select * from A Left join B on A.bid = B.id