沖洗

2011-02-08 85 views
1

異常之前保存的瞬態的實例:對象引用一個未保存的瞬態的實例 - 沖洗之前保存的瞬態的實例:兒童沖洗

如何重現問題: 1. Hibernate是加載實體「家長」 。屬性「child」爲空 2.「父」在屏幕上呈現,然後「child」屬性自動實例化。所以,我有如下圖:

Parent.child != null 
Parent.child.childId = null 
Parent.child.childKey = "" 
Parent.child.childName = "" 

問題:我怎麼能強迫休眠忽略更新或插入兒童實體WHEN childID的= NULL? 如果childId!= null我想創建關係。

<hibernate-mapping> 
    <class name="com.test.Parent" 
    entity-name="ParentObject" table="parent" 
    dynamic-insert="false" dynamic-update="true" optimistic-lock="version"> 
    <id name="rowId" type="long"> 
     <column name="RowID" /> 
     <generator class="native" /> 
    </id> 
    <version name="versionSequence" type="integer" 
     unsaved-value="null" generated="never" insert="false"> 
     <column name="VersionSequence" /> 
    </version> 
    <many-to-one name="child" entity-name="Child" fetch="select" 
     optimistic-lock="true" embed-xml="false" update="true" insert="false"> 
     <column name="ChildID" /> 
    </many-to-one> 
    <property name="dateCreated" type="timestamp"> 
     <column name="DateCreated" length="0" /> 
    </property> 
    <property name="dateUpdated" type="timestamp" update="false"> 
     <column name="DateUpdated" length="0" /> 
    </property> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping> 
    <class name="com.Child" 
    entity-name="Child" table="Child" dynamic-insert="false" 
    dynamic-update="true" optimistic-lock="version"> 
    <id name="childId" type="long" > 
     <column name="ChildID" /> 
     <generator class="native" /> 
    </id> 
    <version name="versionSequence" type="integer" insert="false" 
     generated="never" > 
     <column name="VersionSequence" /> 
    </version> 
    <property name="childKey" type="string" > 
     <column name="ChildKey" length="20" /> 
    </property> 
    <property name="childName" type="string" > 
     <column name="ChildName" length="30" /> 
    </property> 
    <property name="childNumber" type="string" > 
     <column name="ChildNumber" /> 
    </property> 
    <property name="dateCreated" type="timestamp"> 
     <column name="DateCreated" /> 
    </property> 
    <property name="dateUpdated" type="timestamp" update="false"> 
     <column name="DateUpdated" /> 
    </property> 
    </class> 
</hibernate-mapping> 

回答

2

據我瞭解你的問題,你的表示層爲正在顯示的Parent對象添加了一個不必要的子元素,你希望Hibernate忽略它。

如果是這樣,它看起來像表達層的責任,擺脫那個孩子。因此,在將它傳遞迴Hibernate之前,通過在表示層中刪除該子代來「消毒」Parent會更好。

4

使用'級聯'設置。不知道如何用xml做到這一點,但我相信你會在參考文獻中找到它

+0

它不工作,因爲我期望。 hibernate拋出TransientObjectException: – eugenn 2011-02-08 15:47:26

+0

很抱歉誤解了你的問題。我同意axtavt。 Hibernate是做錯的地方。如果你肯定,你可能會考慮攔截器,儘管我不確定他們會爲此工作。 – 2011-02-09 03:14:54