我們使用Hibernate作爲持久層並具有複雜的對象模型。在不暴露實際數據模型的情況下,我想使用下面的簡單示例來解釋問題。使用休眠保存實體與引用的依賴實體
class Person {
private Integer id; //PK
private String name;
private Account account;
// other data, setters, getters
}
class Account {
private Integer id; //PK
// other data, setters, getters
}
數據庫映射使用HBM如下定義:
<class name="Person" table="PERSON">
<id name="id" column="ID">
<generator class="native"/>
</id>
<version name="version" type="java.lang.Long"/>
<property name="name" type="java.lang.String" length="50" column="NAME"/>
<many-to-one name="account" column="ACCOUNT_ID"
class="com.mycompany.model.Account"/>
</class>
我要救鏈接到現有Account
的Person
新填充的實例。該調用是由Web客戶端發起的,因此在我的層中,我獲得了Person的實例,該實例引用了僅保存其ID的Account
實例。
如果我嘗試調用saveOrUpdate(person)
以下異常被拋出:
org.hibernate.TransientObjectException:
object references an unsaved transient instance - save the transient instance before flushing:
com.mycompany.model.Account
爲了避免這一點,我必須找到ID的Account
持久化對象,然後調用person.setAccount(persistedAccount)
。在這種情況下,一切正常。
但在現實生活中,我處理數十個相互引用的實體。我不想爲每個參考書寫特殊的代碼。
我想知道是否有這種問題的某種通用解決方案。
謝謝你,@JB Nizet。這實際上是我的預期......我會在這裏發佈我的通用解決方案的描述,並很樂意知道您的意見。 – AlexR 2012-01-12 17:50:23