在Hibernate中,當您通過負載檢索實體,如果你訪問該實體的ID訪問它不會初始化代理:什麼時候檢索一個Hibernate代理的id初始化代理?
Property myProp = (Property) session.load(Property.class, myId);
myProp.getId(); // Doesn't load the proxy
myProp.getDescription(); // Loads the proxy from the database hit
但是,我不清楚規則是什麼裝載協會代理。我的印象是,當您通過HQL查詢或標準檢索實體時,適用相同的規則。
在我的代碼中的每個Property
有一個Company
。該Company
被宣佈爲:
@ManyToOne(fetch = FetchType.LAZY, optional=false)
@JoinColumn(name = "company_id", nullable=false)
private Company company;
然而,在我的代碼通過Properties
迭代,因爲當我打電話Company.getId()
的Company
被加載時,我目前得到N + 1種選擇。
在Company
和Property
對象中,id字段是一個用@Id
註解的Long。
爲了防止加載Company
實體,是否還有其他一些考慮因素?
答案是一個很好的開始,但第一個評論是最好的答案。請務必閱讀Gennady Shumakher發佈的鏈接。 此外,如果有人很好奇,我發現在這個問題上的Hibernate數據庫有一個錯誤:http://opensource.atlassian.com/projects/hibernate/browse/HHH-3718 – jbarz 2010-02-11 15:35:46