-->
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.  [ 3 posts ] 
Author Message
 Post subject: saveOrUpdate() Problem
PostPosted: Wed Oct 17, 2007 5:31 am 
Newbie

Joined: Tue Oct 02, 2007 12:19 pm
Posts: 7
Hallo. Zu diesem Thema gibt es zwar schon sehr viele Topics, aber dennoch komme ich einfach nicht weiter. Vielleicht verstehe ich da auch etwas falsch.

Das Speichern klappt. Das sieht dann so aus:

Action-Methode die augerufen wird.
Code:
   public String saveUser(){
      Session session = HibernateSessionVerwaltung.getSession();
      session.save(user);   
      System.out.println("Wert vom Namen: " + UserHandler.this.user.getName());
      return "success";
   }


Mapping-Datei:
Code:
  <hibernate-mapping>
      <class name="beans.User" table="USER" >
          <id name="userId" type="java.lang.Integer" column="USER_ID" >
                <generator class="native" />
          </id>
          <property name="name" type="java.lang.String" column="NAME"/>         
          <property name="age" type="java.lang.Integer" column="AGE"/>         
      </class>
  </hibernate-mapping>


Jetzt verstehe ich es so, dass durch den generator class="native", den neu abzupeichernden Objekten, eine id verpasst wird. Kann ich ja eindeutig in meiner MYSQL-DB sehen. Natürlich werden bisher auch gleiche Eingaben unter einer neuen id gespeichert. Will ich natürlich so nicht.
Habe mir einiges im Inet durchgelesen und bin auf saveOrUpdate() gestoßen. Hört sich ja optimal an, da ich das so verstanden habe, dass Hibernate bei gleichen Eingaben das "alte Objekt" einfach updatet. So soll es sein.

Leider klappt das nicht so wie ich mir das vorstelle. Wenn ich in der Action-Methode anstatt session.save(user); einfach session.saveOrUpdate(user); schreibe, dann erhalte ich folgende Exception:
Quote:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [beans.User#13


Die Exception hört sich ja ganz logisch an, aber ich habe gedacht das Hibernate automatisch updatet. Wieso erhalte ich die Exception? Habe zwar im Internet schon einiges darüber gelesen, aber es soll ja ein ganz einfaches Beispiel sein und ich nicht verstehe wieso er nicht updatet:
a) liegt es an der Generator Klasse?
b) liegt es an der session?

über baldige Antwort würde ich mich sehr freuen.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Oct 18, 2007 5:27 am 
Newbie

Joined: Tue Oct 02, 2007 12:19 pm
Posts: 7
hier antwortet mir ja bestimmt eh keiner, aber ich versuchs nochmal...

Code:
    public String loadUser(){
        Session session = HibernateSessionVerwaltung.getSession();
        derUser = (User) session.load(User.class, aUser);
           user.setName(derUser.getName());
        user.setAge(derUser.getAge());
        return "laden";
     }


Durch diese Methode habe ich eindeutig "derUser" geladen. darunter fülle ich die bean-properties mit den aktuellen werten.

das aktuell geladene objekt lasse ich mir in einem neuen Formular anzeigen und will es hier verändern. jetzt will ich das geladenen objekt updaten.
klappt aber nicht weil ich immer die oben genannte exception erhalte.
wenn ich merge() benutze wird immer immer der zuletzt eingetragene wert geupdatet, obwohl ich ja eigentlich ein anderes objekt geladen habe.

ich muss dazu sagen. die methode loadUser() startet die session, startet die transaktion, läd das objekt, transaktion wird commit und session geschlossen.

rufe ich jetzt die methode updateUser() auf, dann wird eine neue Session gestartem transaktion gestarte, dann soll das update geschehe, transaktion commitet und session beendet.

wenn ich die doku richtig verstanden habe, dann müßte es doch so gehen, weil ich doch folgendes beherzige

• the application loads an object in the first session
• the object is passed up to the UI tier
• some modifications are made to the object
• the object is passed back down to the business logic tier
• the application persists these modifications by calling update() in a second session

wenn ich nicht wenigstes eine antworz bekomme, dann ist es hier wohl vergebens ;-)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Oct 18, 2007 10:02 am 
Newbie

Joined: Tue Oct 02, 2007 12:19 pm
Posts: 7
ich weiß es antwortet keiner, sage es aber trotzdem ;-)...

Session öffnen
Transaction beginnen
ich bin der meinung das ich mein ich durch session.load(); mein Objekt lade.
so, jetzt ist das Objekt im persistenetn Zustand.
Transaction schließen
Session beenden

jetzt ist das Objekt im zsutand Detached und es soll wie folgt weitergehen:


Session öffnen
Transaction beginnen
jetzt soll das update() des aktuellen Objektes stattfinden
Transaction schließen
Session beenden

So die Theorie. Habe ich da schon einen Fehler?

Bitte um Antwort :-)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 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.