2009-06-25 14 views
6

Sto ottenendo il seguente eccezione quando si tenta di aggiornare un oggetto:Hibernate aiuto Eccezione: TransientObjectException

org.hibernate.TransientObjectException: oggetto fa riferimento a un'istanza transiente non salvato - salva l'istanza transitorio prima del lavaggio: .... ..

Qualcuno può aiutare ???

L'oggetto che sto cercando di aggiornare ha l'attributo 'lazy' impostato su false nel file di mapping. Sembra che ibernazione mi aspetti che salvi gli oggetti figlio prima che svuoti l'aggiornamento ???

EDIT (aggiunta):

<hibernate-mapping> 
    <class name="utils.message.Message" table="messages"> 
     <id name="id" column="message_id"> 
      <generator class="native" /> 
     </id> 
     <property name="message_text" column="message_text" /> 
     <property name="message_file" column="message_file" /> 
     <property name="is_active" column="is_active" type="boolean"/> 
     <property name="is_global" column="is_global" type="boolean"/> 
     <property name="start" column="start" type="java.util.Date"/> 
     <property name="end" column="end" type="java.util.Date"/> 
     <property name="last_updated" column="last_updated" type="java.util.Date"/>  

     <many-to-one name="last_updated_by" class="utils.user.User" column="last_updated_by" lazy="false"/> 
     <many-to-one name="healthDepartment" class="utils.healthdepartment.HealthDepartment" column="health_department_id" lazy="false"/> 

    </class> 
</hibernate-mapping> 
+0

sembra utilizzando la proprietà a cascata nel file di mapping potrebbe risolvere il mio problema ?? non sono sicuro di quale stile sia appropriato per me. (anche se penso che usare solo delete-orphan sarebbe ciò di cui ho bisogno). può essere un po 'difficile capire i documenti di ibernazione da una prospettiva newbie. – Rafael

+0

È possibile pubblicare parti pertinenti del file di mappatura o delle annotazioni di hibhernate? – skaffman

risposta

0

L'app è in un ambiente di primavera. Correzione: per eseguire l'aggiornamento dall'interno dell'ambiente Hibernate.

+0

cosa significa? Come è questa una risposta? –

15

TransientObjectException si verifica quando si salva un oggetto che fa riferimento a un altro oggetto che è transitorio (che significa che ha il valore di identificatore di "default", spesso null) e poi a filo della sessione. Questo accade in genere quando si crea un intero grafico di nuovi oggetti ma non li si è salvati in modo esplicito. Esistono due modi per ovviare al problema:

  1. Come suggerito, è possibile utilizzare la sovrapposizione di salvataggi ad altri oggetti associati. Tuttavia, il collegamento in cascata non era realmente inteso come soluzione alternativa per TOE, ma piuttosto come comoda soluzione per salvare un gruppo di oggetti correlati che vengono spesso manipolati insieme. Se si scollegano gli oggetti senza il set completo di dati associati e quindi lo si salva con il collegamento in cascata abilitato, è possibile eliminare inavvertitamente i dati che non si desidera perdere.
  2. Assicurarsi che tutti gli oggetti transitori nel grafico siano salvati in modo esplicito come parte della propria unità di lavoro. Questo è solo un caso di capire in che modo la tua applicazione creerà un oggetto grafico e quali entità sono transitorie e quali potrebbero essere persistenti o distaccate.

mi sento di raccomandare la lettura di questo intero capitolo dalla documentazione Hibernate per comprendere appieno la terminologia di transitorio, persistente e distaccato:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html

+1

L'URL sopra riportato è rotto; eccone il nuovo http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html – ManuPK

0

Con una relazione molti-a-uno, non sarebbe essere appropriato per Hibernate per le operazioni di persistenza in cascata, poiché "uno" è concettualmente un'entità condivisa tra molti altri. Questo tipo di relazione non è un "oggetto figlio", come dici tu.

è possibile ignorare questo comportamento impostando in modo esplicito l'attributo a cascata sul rapporto, oppure è possibile persistere manualmente l'altra estremità dei molti-a-uno rapporti.

+0

Skaffman, Grazie per il chiarimento. Ho appena letto il documento suggerito da brd6644. Ha aiutato a capire meglio alcuni concetti fondamentali di Hibernate. In definitiva, ciò di cui ho bisogno di aiuto è capire come essere in grado di aggiornare un messaggio senza collegare l'operazione all'utente/HD associato al messaggio. – Rafael

3

amico usa proprietà "cascade = true" nella mappatura. tutto andrà bene ... V-Boy

Problemi correlati