在冲洗之前保存瞬态实例

时间:2011-02-08 14:21:35

标签: hibernate

异常:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:Child

如何重现问题: 1. Hibernate加载实体“Parent”。属性“child”为null 2.“父”在屏幕上呈现,之后“子”属性被自动实例化。所以我有以下图表:

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

问题:如何强制Hibernate忽略更新或插入Child实体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 个答案:

答案 0 :(得分:5)

使用“级联”设置。不知道如何使用xml,但我相信你会在参考

中找到它

答案 1 :(得分:2)

据我了解您的问题,您的表示层会向正在显示的Parent对象添加一个不必要的子项,并且您希望Hibernate忽略它。

如果是这样,表示层的责任似乎是摆脱那个孩子。因此,最好通过在表示层中删除该子节点并将其传递回Hibernate来“清理”Parent