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