假設提供了以下映射:是否可以在沒有對象到對象映射的情況下強制執行外鍵?
<class name="A" table="a_table">
<id name="id"/>
<many-to-one name="entityB" column="fk_B" not-null="false" unique="true"/>
</class>
<class name="B" table="b_table">
<id name="id"/>
</class>
Java類:
public class A {
private long id;
private B entityB;
// getters and setters skipped
}
是否有可能改變的Hibernate映射,使外鍵在啓動仍在執行,創建由Hibernate,但是類A
看起來將如下所示:
public class A {
private long id;
private long idOfB;
// getters and setters skipped
}
據我所知,如果我將<many-to-one...
轉換爲<property...
這可以工作,但外鍵不會被數據庫強制執行。
我需要這樣做,因爲對象B
可能(也可能不會)分別初始化這有時會導致 org.hibernate.LazyInitializationException: could not initialize proxy - no Session
異常時a.getB()
被稱爲發生。我寧願將它作爲long idOfB
,並在需要時加載整個對象;這也會使加載對象A
更快。
我相信我的問題是非常相似的this one,但所提供的解決方案(使用延遲加載)是不是在我的情況適合作爲即使我打電話a.getB().getId()
,我會得到LazyInitializationException
,而如果我叫a.getIdOfB()
我不會」噸。
非常感謝。
我強烈建議使用LazyLoading而不是重新發明輪子。你會得到類型安全的實體類,性能完全一樣,並且可能會取消自定義重載代碼。 請注意,如果使用不正確,LazyLoading只會導致LazyLoadingException,即在會話關閉後請求延遲加載。另請注意,請求對象的ID不會導致加載對象。我建議你發佈一個關於LazyLoading具體問題的問題。 – meriton 2010-01-25 18:50:18
相信我,我確實使用LazyLoading。在我無法做到的情況下,這只是一個例子。否則我不會問。 – mindas 2010-01-26 10:26:49
相關問題:[java的 - 休眠 - 外鍵而不是實體](http://stackoverflow.com/questions/6311776/hibernate-foreign-keys-instead-of-entities)。 – 2016-10-14 10:53:27