-->
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: speichern von one-to-many mit cascade="all" und sequence
PostPosted: Sat Oct 31, 2009 8:55 pm 
Newbie

Joined: Sat Oct 31, 2009 8:24 pm
Posts: 3
Hallo zusammen
Leider bin ich schon seit langer zeit an einem problem mit hibernate und habe nun gedacht ich frage jetzt hier, bevor ich definitiv aufgebe.
In der Datenbank habe ich 3 tabellen person, role und eine beziehungstabelle personrole, also eine m:n beziehung. Weil die tabelle personrole nicht nur aus fremdkey attributen besteht sonder auch aus zusätzlichen attributen wie beispielsweise initdate, habe ich auch in der Java Welt drei Klassen nämlich Person, Role und Personrole. Zusätzlich die Klasse PersonroleId als composite key.

Was ich nun möchte, ist eine Person erstellen und dann eine personrole an diese person anhängen. Nach einem save der erstellten person, erwarte ich, dass auch die beziehung personrole in die Datenbank abgelegt wird. Wenn ich in der Datei Person.hbm.xml folgendes setze: cascade="all" dann wird das auch versucht.

Nun ist es so, dass eine person in der tabelle eine personid bekommt und zwar über eine sequenz. Was ich auch im Person.hbm.xml so definiert habe:
Code:
<id name="personid" type="int">
<column name="personid" />
<generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
  <param name="sequence_name">person_seq</param>
</generator>
</id>


Mein code sieht nun vereinfacht so aus:

Code:
Person person = new Person("Peter", "Muster", true);
Role role = (Role)SessionFactoryUtil.getInstance().openSession().load(Role.class, 2); //bestehende Role benutzen für die beziehung
person.addRole(3, role);


Die Methode addRole sieht dabei so aus:

Code:
public Personrole addRole(int visits, Role role) {
Personrole pr = new Personrole(new PersonroleId(role.getRoleid(), this.getPersonid()), role, this, new Date(), visits);
this.getPersonroles().add(pr);
role.getPersonroles().add(pr);
return pr;
}


Mein Problem ist nun this.getPersonid(), weil ich die personid nicht gesetzt habe oder nicht weiss mit was ich sie setzen soll (wird ja von der sequenz bestimmt) ist die einfach 0, Hibernate sagt dann verständlicherweise, foreign-key violation personid, weil es eine person mit persionid 0 nicht gibt.

Wie löst man dieses Problem, muss ich zuerst die person speichern, dann denn sequenz wert abfragen und damit die personrole speichern? Oder gibt es eine Möglichkeit, das in einem schritt zu erledigen?

Wenn mir hier jemand weiterhelfen könnte, wäre ich sehr dankbar.
Gruss kolli


Top
 Profile  
 
 Post subject: Re: speichern von one-to-many mit cascade="all" und sequence
PostPosted: Fri Nov 06, 2009 8:59 am 
Newbie

Joined: Sat Oct 31, 2009 8:24 pm
Posts: 3
Kennt niemand dieses Problem oder ist meine frage zu kompliziert gestellt?


Top
 Profile  
 
 Post subject: Re: speichern von one-to-many mit cascade="all" und sequence
PostPosted: Fri Nov 06, 2009 7:02 pm 
Newbie

Joined: Sat Oct 31, 2009 8:24 pm
Posts: 3
Falls jemand das gleiche problem hat. ich habe nun für mich eine lösung gefunden.

ich verwende im Person.hbm.xml nun keine sequence mehr sondern nur assigned:
<id name="personid" type="int">
<column name="personid" />
<generator class="assigned" />
</id>

assigned heisst soviel wie setze die id selbst.


Dann hole ich den nächsten freien pk mit:

Connection conn = SessionFactoryUtil.getInstance().openSession().connection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select nextval ('person_seq')");
rs.next();
int personid = rs.getInt(1);

Anschliessend setze ich die id bereits beim erstellen des objektes von hand
Person person = new Person(personid, "Peter", "Muster31", true);


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.