[英]Hibernate lazy loading not working
我正在使用版本3.6.1.Final
我的實體bean中有以下屬性
@JoinColumn( name = "FOLDER_PARENT_ID", referencedColumnName = "FOLDER_ID" )
@ManyToOne(cascade=CascadeType.MERGE, fetch= FetchType.LAZY )
private FolderTbl parent;
在我的單元測試中,Assertnull失敗,因為getParent()不為null
assertNull( folderTbl.getParent() );
還有什么辦法可以阻止hibernate加載父進程?
即使將lazy設置為true,父值也不會為null。 延遲加載使用代理對象並將其分配給父屬性。 當我們嘗試使用父(調用getParent()
)時,它將使用代理對象加載實際的父對象。
如果您不想加載該對象,請不要為該項配置JPA屬性並將其設置為瞬態。
父正確配置為懶惰加載 ,關鍵是您正在錯誤地測試它 。
當你調用方法getParent()
,Hibernate將加載對象,當它將加載對實際對象的請求時。
您可以通過將show_sql
配置為true來檢查此事。 它會在你調用getParent()
時調用一個查詢
Hibernate將Lazy抓取視為提示。 以下是JPA 2.0規范在第364頁表9中所述的內容。
(可選)字段或屬性的值是應該延遲加載還是必須急切獲取。 EAGER策略是持久性提供程序運行時的要求,必須急切地獲取該值。 LAZY策略是對持久性提供程序運行時的提示。
對於某些情況,您可能根本不需要加載延遲集合。 您可以使用下面的方法從會話中分離集合。
public class. .... {
.....
@JoinColumn( name = "FOLDER_PARENT_ID", referencedColumnName = "FOLDER_ID" )
@ManyToOne(cascade=CascadeType.MERGE, fetch= FetchType.LAZY )
private FolderTbl parent;
...
public void detachLazyObjects() {
parent = null;
}
然后調用此方法將類從您需要的位分離為null。 請謹慎使用此快捷方式,我建議您在使用此解決方案之前考慮其他方法。
實際上,調用getParent()可能會返回一個代理實例,顯示有父代。 如果訪問id以外的字段,則必要時將加載父項。
請注意,父級可能已由事務加載,因此駐留在第一級高速緩存中。 如果是這樣,Hibernate通常不會對數據庫進行另一次查詢。
如前所述,如果您的實體具有對父級的非瞬態引用,則getParent()將始終返回非null值,即使父級本身尚未加載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.