簡體   English   中英

Hibernate延遲加載無法正常工作

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

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