2009-06-25 7 views
6

Ich erhalte die folgende Ausnahme, wenn ich versuche, ein Objekt zu aktualisieren:Hibernate Ausnahme Hilfe: TransientObjectException

org.hibernate.TransientObjectException: Objekt verweist auf eine nicht gespeicherte transiente Instanz - vor dem Spülen die transiente Instanz speichern: .... ..

Kann jemand helfen ???

Das Objekt, das ich zu aktualisieren versuche, hat das Attribut 'Lazy' in der Zuordnungsdatei auf false gesetzt. Sieht aus wie Hibernate erwartet, dass ich untergeordnete Objekte speichern, bevor es das Update leert ???

EDIT (ergänzt):

<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

scheint, wie Kaskade Eigenschaft in Mapping-Datei könnte mein Problem lösen ?? nur nicht sicher, welcher Stil für mich geeignet ist. (obwohl ich denke, nur mit delete-orphan wäre was ich brauche). es kann ein wenig schwer zu verstehen Hibernate Docs aus der Perspektive eines Newbie. – Rafael

+0

Können Sie relevante Teile Ihrer Hibhernate-Mapping-Datei oder Anmerkungen veröffentlichen? – skaffman

Antwort

0

App ist in einer Frühlingsumgebung. Fix: um das Update innerhalb der Hibernate-Umgebung auszuführen.

+0

was bedeutet das? Wie ist das eine Antwort? –

15

TransientObjectException tritt auf, wenn Sie ein Objekt speichern, das ein anderes Objekt verweist, die vergänglich ist (dh es ist die „default“ Kennungswert hat, häufig null) und dann die Session spülen. Dies tritt häufig auf, wenn Sie einen vollständigen Graphen neuer Objekte erstellen, aber nicht alle explizit gespeichert haben. Es gibt zwei Möglichkeiten, um dies zu umgehen:

  1. Wie Sie vorschlagen, könnten Sie die Kaskadierung von Speichern zu anderen zugeordneten Objekten verwenden. Die Kaskadierung war jedoch nicht wirklich als Problemumgehung für TOE gedacht, sondern eher als eine Möglichkeit, eine Gruppe verwandter Objekte zu speichern, die häufig zusammen manipuliert werden. Wenn Sie Ihre Objekte ohne ihre vollständigen zugeordneten Daten loslösen und diese dann mit aktivierter Kaskadierung speichern, können Sie versehentlich Daten löschen, die Sie nicht verlieren möchten.
  2. Stellen Sie sicher, dass alle temporären Objekte in Ihrem Diagramm explizit als Teil Ihrer Arbeitseinheit gespeichert sind. Dies ist nur ein Fall, um zu verstehen, wie Ihre Anwendung einen Objektgraphen erstellt und welche Entitäten vorübergehend sind und welche persistent oder losgelöst sein können. vollständig die Terminologie von transienten zu verstehen, persistent und freistehenden

ich empfehlen würde dieses ganzes Kapitel aus den Hibernate-Dokumenten zu lesen:

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

+1

Die obige URL ist kaputt; Hier ist das neue @ http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html – ManuPK

0

Mit einer Viele-zu-eins-Beziehung, wäre es nicht geeignet sein, dass Hibernate Persistenzoperationen kaskadiert, da die "Eins" konzeptionell eine Entität ist, die von vielen anderen geteilt wird. Diese Art von Beziehung ist kein "Kind-Objekt", wie Sie es nennen.

Sie können dieses Verhalten überschreiben, indem Sie das Attribut cascade für die Beziehung explizit festlegen, oder Sie können das andere Ende der Viele-zu-Eins-Beziehungen manuell beibehalten.

+0

Skaffman, Danke für die Klarstellung. Ich habe gerade das Dokument gelesen, das von brd6644 vorgeschlagen wurde. Es half, einige grundlegende Konzepte von Hibernate besser zu verstehen. Letztlich, was ich brauche Hilfe herauszufinden, ist, wie in der Lage, eine Nachricht zu aktualisieren, ohne die Operation auf den User/HD mit der Nachricht zu kaskadieren. – Rafael

3

dude verwenden Eigenschaft "cascade = true" im Mapping. alles wird gut ... V-Boy

Verwandte Themen