2011-02-08 4 views
1

Исключения: объекта ссылается на несохраненный переходный экземпляре - сохранить переходный экземпляр перед промывкой: Ребеноксохранить переходный экземпляр перед промывкой

Как воспроизвести проблему: 1. Гибернации загрузить сущности «Родитель» , Свойство «child» равно null 2. «Родитель» отображается на экране, после чего свойство «child» автоматически создается. Таким образом, у меня есть следующий график:

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

Вопрос: Как я мог заставить Hibernate игнорировать обновления или вставки дочернего объекта Когда childId = нуль? Если 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 игнорировал это.

Если это так, то это означает, что слой презентаций должен избавиться от этого ребенка. Таким образом, было бы лучше «дезинфицировать» Parent, удалив этого ребенка внутри слоя презентации, прежде чем передавать его обратно в Hibernate.

+0

Вы правы. Spring автоматически создает экземпляр дочернего объекта, и, если возможно, я сохраню эту функцию. Поэтому я нахожу способ научить спящий режим игнорировать подобные объекты. – eugenn

+1

@eugenn: Еще раз: это не ответственность Hibernate. Если вы перенесите неверную модель на слой сохранения, слой persistence будет сохраняться неправильно. Поэтому вы должны удалить эти неправильные дочерние элементы внутри контроллера. – axtavt

4

Используйте настройки «каскада». Не знаю, как это сделать с помощью xml, но я уверен, что вы найдете его в ссылке

+0

<имя-фамилия = "поставщик" entity-name = "поставщик" fetch = "select" optimistic-lock = "true" embed-xml = "false" update = "true" insert = "false "cascade =" none "> он не работает, как я ожидаю. спящий переход TransientObjectException: – eugenn

+0

Извините, неправильно понял ваш вопрос. Я согласен с axtavt. Hibernate - это неправильное место для этого. Если вам нужно, вы можете подумать о перехватчиках, хотя я не уверен, что они будут работать на это. –

Смежные вопросы

 Смежные вопросы