-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 8 posts ] 
Author Message
 Post subject: SaleStateException beim Speichern eines Sets
PostPosted: Fri Jun 16, 2006 5:00 am 
Regular
Regular

Joined: Thu Jun 08, 2006 5:32 pm
Posts: 52
Hibernate version: 3

Hi ich habe folgendes Problem: Ich habe eine Klasse Reservierung mit einem Set von Zusatzleistungen. Wenn ich nun zu einer bestehenden Reservierung eine Zusatzleistung hinzufügen möchte und sie danach via Hibernate update, wird eine SaleStateException geworfen. Wenn ich show_sql auf true setze, sehe ich, dass Hibernet bei den neu angelegten Objekten (Zusatzleistungen) im Set kein insert sondern ein update macht, das dann logischer weise zu dieser Exception führt, da sie Zusatzleistungen ja noch nicht in der DB existieren. Warum macht Hibernate ein update anstelle eines inserts?!?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 16, 2006 11:07 am 
Beginner
Beginner

Joined: Fri May 19, 2006 11:34 am
Posts: 29
Hallo,

dafür müsste man dein Mapping und die POJOs kennen, um dafür eine konkrete Aussage treffen zu können. Hibernate scheint davon auszugehen, dass es diese Elemente bereist gibt, und du nur Wertänderungen auf den Zusatzleistungen durchführst.

Viele Grüsse
Kai


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jun 16, 2006 4:11 pm 
Regular
Regular

Joined: Thu Jun 08, 2006 5:32 pm
Posts: 52
die Mappingdateien sehen wie folgt aus:

VOReservierung
Code:
<hibernate-mapping>
   <class name="lg.vo.VOReservierung" table="VOReservierung">
      <id name="oid" type="int" column="OID" >
          <generator class="increment"/>
       </id>
   
       <many-to-one name="kunde" column="ID_KUNDE" class="lg.vo.VOKunde"/>
   
       <many-to-one name="zimmer" column="ID_ZIMMER" class="lg.vo.VOZimmer"/>
        
         <property name="nummer">
            <column name="NUMMER"/>
         </property>
      
         <property name="von">
            <column name="VON"/>
         </property>
      
         <property name="bis">
            <column name="BIS"/>
         </property>
         
         <property name="anreise">
            <column name="ANREISE"/>
         </property>
         
         <property name="abreiseOderStorniert">
            <column name="ABREISE_ODER_STORNIERT"/>
         </property>
         
         <property name="rechnungsDatum">
            <column name="RECHNUNGSDATUM"/>
         </property>
      
         <property name="rechnungsSummeInCent">
            <column name="RECHNUNGSSUMME_IN_CENT"/>
         </property>
         
         <property name="zeitstempel">
         <column name="ZEITSTEMPEL" />
      </property>
      
         <set name="zusatzleistung" table="vozusatzleistung">
            <key column="reservierung_oid"/>
            <one-to-many class="lg.vo.VOZusatzleistung"/>
      </set>
   </class>
</hibernate-mapping>


VOZusatzleistung

Code:
<hibernate-mapping>
   <class name="lg.vo.VOZusatzleistung" table="VOZusatzleistung">
      <id name="oid" type="int" column="OID" >
          <generator class="increment"/>
       </id>
   
       <many-to-one name="typ" class="lg.vo.VOZusatzleistungsTyp" />
      
       <property name="von">
            <column name="VON"/>
         </property>
      
         <property name="bis">
            <column name="BIS"/>
         </property>
         
       <property name="preisProNachtInCent">
            <column name="PREIS_PRO_NACHT_IN_CENT"/>
      </property> 
   </class>
</hibernate-mapping>


und die Klassen so:

VOReservierung

Code:
public class VOReservierung extends VOObject {
   
   private int nummer;
   private Timestamp von;
   private Timestamp bis;
   private Timestamp anreise;
   private Timestamp abreiseOderStorniert;
   private Timestamp rechnungsDatum;
   private int rechnungsSummeInCent;
   private VOKunde kunde;
   private VOZimmer zimmer;
   private Set<VOZusatzleistung> zusatzleistung = new HashSet();
   
   //--------------------------------------------------------------------------------

   public VOReservierung() {}
   
   //--------------------------------------------------------------------------------
   
   public VOReservierung(final Timestamp i_von, final Timestamp i_bis, final VOKunde i_kunde,
         final VOZimmer i_zimmer) {
      
      this(-1, null, -1, i_von, i_bis, null, null, null, 0, i_kunde, i_zimmer, new HashSet<VOZusatzleistung>());
   }
   
   //--------------------------------------------------------------------------------
   
   public VOReservierung(final int i_oid, final Timestamp i_zeitstempel, final int i_nummer,
         final Timestamp i_von, final Timestamp i_bis, final Timestamp i_anreise,
         final Timestamp i_abreiseOderStorniert, final Timestamp i_rechnungsDatum,
         final int i_rechnungsSummeInCent, final VOKunde i_kunde, final VOZimmer i_zimmer,
         final Set<VOZusatzleistung> i_zusatzleistungen) {
      
      super(i_oid, i_zeitstempel);
      
      this.nummer = i_nummer;
      this.von = i_von;
      this.bis = i_bis;
      this.anreise = i_anreise;
      this.abreiseOderStorniert = i_abreiseOderStorniert;
      this.rechnungsDatum = i_rechnungsDatum;
      this.rechnungsSummeInCent = i_rechnungsSummeInCent;
      this.kunde = i_kunde;
      this.zimmer = i_zimmer;
      this.zusatzleistung = i_zusatzleistungen;
   }
   
   //--------------------------------------------------------------------------------

   public Timestamp getVon() { return this.von; }
   
   //--------------------------------------------------------------------------------
   
   public void setVon(final Timestamp i_von) { this.von = i_von; }

   //--------------------------------------------------------------------------------
   
   public Timestamp getBis() { return bis; }
   
   //--------------------------------------------------------------------------------
   
   public void setBis(final Timestamp i_bis) { this.bis = i_bis; }

   //--------------------------------------------------------------------------------
   
   public int getNummer() { return this.nummer; }
   
   //--------------------------------------------------------------------------------
   
   public void setNummer(final int i_nummer) { this.nummer = i_nummer; }
   
   //--------------------------------------------------------------------------------

   public Timestamp getRechnungsDatum() { return this.rechnungsDatum; }
   
   //--------------------------------------------------------------------------------
   
   public void setRechnungsDatum(final Timestamp i_rechnungsDatum) { this.rechnungsDatum = i_rechnungsDatum; }
   
   //--------------------------------------------------------------------------------
   
   public int getRechnungsSummeInCent() { return this.rechnungsSummeInCent; }
   
   //--------------------------------------------------------------------------------
   
   public void setRechnungsSummeInCent(final int i_rechnungsSummeInCent) { this.rechnungsSummeInCent = i_rechnungsSummeInCent; }
   
   //--------------------------------------------------------------------------------
   
   public Timestamp getAbreiseOderStorniert() { return this.abreiseOderStorniert; }
   
   //--------------------------------------------------------------------------------
   
   public void setAbreiseOderStorniert(final Timestamp i_abreiseOderStorniert) { this.abreiseOderStorniert = i_abreiseOderStorniert; }

   //--------------------------------------------------------------------------------
   
   public Timestamp getAnreise() { return this.anreise; }
   
   //--------------------------------------------------------------------------------
   
   public void setAnreise(final Timestamp i_anreise) { this.anreise = i_anreise; }
   
   //--------------------------------------------------------------------------------
   
   public VOKunde getKunde() { return this.kunde; }
   
   //--------------------------------------------------------------------------------

   public void setKunde(final VOKunde i_kunde) { this.kunde = i_kunde; }
   
   //--------------------------------------------------------------------------------

   public VOZimmer getZimmer() { return this.zimmer; }
   
   //--------------------------------------------------------------------------------

   public void setZimmer(final VOZimmer i_zimmer) { this.zimmer = i_zimmer; }

   //--------------------------------------------------------------------------------
   
   public Set<VOZusatzleistung> getZusatzleistung() { return this.zusatzleistung; }

   //--------------------------------------------------------------------------------
   
   public void setZusatzleistung(final Set<VOZusatzleistung> i_zusatzLeistung) { this.zusatzleistung = i_zusatzLeistung; }
   
}


VOZusatzleistung

Code:
public class VOZusatzleistung {

   private int oid;
   private VOZusatzleistungsTyp typ;
   private Timestamp von;
   private Timestamp bis;
   private int preisProNachtInCent;
   
   //--------------------------------------------------------------------------------

   public VOZusatzleistung() {}
   
   //--------------------------------------------------------------------------------

   public VOZusatzleistung(final int i_oid, final VOZusatzleistungsTyp i_typ, final Timestamp i_von,
         final Timestamp i_bis, final int i_preisProNacht) {
      
      this.oid = i_oid;
      this.typ = i_typ;
      this.von = i_von;
      this.bis = i_bis;
      this.preisProNachtInCent = i_preisProNacht;
   }

   //--------------------------------------------------------------------------------

   public Timestamp getBis() { return this.bis; }

   //--------------------------------------------------------------------------------

   public void setBis(final Timestamp i_bis) { this.bis = i_bis; }

   //--------------------------------------------------------------------------------
   
   public int getOid() { return this.oid; }

   //--------------------------------------------------------------------------------

   public void setOid(final int i_oid) { this.oid = i_oid; }

   //--------------------------------------------------------------------------------

   public VOZusatzleistungsTyp getTyp() { return this.typ; }

   //--------------------------------------------------------------------------------

   public void setTyp(final VOZusatzleistungsTyp i_typ) { this.typ = i_typ; }

   //--------------------------------------------------------------------------------
   
   public Timestamp getVon() { return this.von; }
   
   //--------------------------------------------------------------------------------
   
   public void setVon(final Timestamp i_von) { this.von = i_von; }
   
   //--------------------------------------------------------------------------------
   
   public int getPreisProNachtInCent() { return this.preisProNachtInCent; }

   //--------------------------------------------------------------------------------
   
   public void setPreisProNachtInCent(final int i_preisProNachtInCent) { this.preisProNachtInCent = i_preisProNachtInCent; }
}


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jun 19, 2006 5:39 pm 
Regular
Regular

Joined: Thu Jun 08, 2006 5:32 pm
Posts: 52
hat keiner eine idee worans liegen könnte?!?


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jun 26, 2006 3:29 am 
Regular
Regular

Joined: Thu Jun 08, 2006 5:32 pm
Posts: 52
so ich habe nun alles ausprobiert das mir eingefallen ist... ich finde den fehler nicht. muss man im <set...>-Tag evtl. etwas zusätzlich angeben, damit der anstelle eines update ein insert macht?!?


Top
 Profile  
 
 Post subject:
PostPosted: Thu Jun 29, 2006 7:08 am 
Newbie

Joined: Mon Apr 24, 2006 5:56 am
Posts: 7
QStorm wrote:
so ich habe nun alles ausprobiert das mir eingefallen ist... ich finde den fehler nicht. muss man im <set...>-Tag evtl. etwas zusätzlich angeben, damit der anstelle eines update ein insert macht?!?


du probierst also sowas wie:

reservierung.addZusatzleistung(new Zusatzleistung(....));

session.update(reservierung);

??

zuerst mal: damit hibernate auch die zusatzleistungen im reservierungsobjekt verwaltet müsstest du im mapping an cascade angeben... anscheinend ist standardmäßig cascade="update" eingestellt, deswegen wohl das update-statment... probier mal cascade="save-update"

ist aber nur ins blaue geraten...


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 11, 2006 1:59 am 
Regular
Regular

Joined: Thu Jun 08, 2006 5:32 pm
Posts: 52
ja genauso habe ich es gemacht? sollte man es nicht so machen und was wäre eine bessere variante?

mfg


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jul 11, 2006 10:36 am 
Beginner
Beginner

Joined: Fri May 19, 2006 11:34 am
Posts: 29
Versuche mal beim Mapping der Zusatzleistungen in Reservierungen ein cascade="all". Es handelt sich schliesslich um eine neue Zusatzleistung und damit ein insert.

Code:
<set name="zusatzleistung" table="vozusatzleistung" cascade="all">
            <key column="reservierung_oid"/>
            <one-to-many class="lg.vo.VOZusatzleistung"/>
      </set>


Viele Grüsse
Kai


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 8 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.