Hallo!
Ich habe die Aufgabe eine bestehende Tabellenstruktur zu mappen.
Ein wirklich hartnäckiges Problem habe ich beim Mappen einer 1:1-Verbindung die einen gemeinsamen Schlüssel benutzen soll. Dieser ist zudem als 'IDENTITY' definiert.
Meine bisherigen Versuche sehen so aus:
Code:
@Entity
public class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id ;
@OneToOne(optional = false, fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@PrimaryKeyJoinColumn
@JoinColumn(name = "id")
private Child child;
public Parent(Object ...) { // Stuff for initialising domain-object
...
Child.create(this) ;
}
...
}
@Entity
public class Child {
@Id
@GeneratedValue(generator = "myIdGenerator")
@GenericGenerator(name = "myIdGenerator", strategy = "foreign", parameters = @Parameter(name = "property", value = "parent"))
private Long id ;
@OneToOne(mappedBy = "child")
@JoinColumn(name="id")
private Parent parent ;
protected Child(Parent parent) {
this.parent = parent ;
parent.setChild(this) ;
}
public static Child create(Parent parent) {
return null != parent ? new Child(parent) : null ;
}
...
}
Zumindest theoretisch sollte das alles so stimmen :)
Wenn ich nun eine neues 'Parent-Objekt' anlegen und speichern möchte, bekomme ich folgenden Fehler:
Code:
Caused by: org.hibernate.id.IdentifierGenerationException: null id generated for:class Child
Der Code zum Erzeugen/Speichern sieht wie folgt aus:
Code:
Parent parent = new Parent(blablabla) ;
entityManager.persist(parent) ;
Ich bin ratlos :( Mir ist zwar klar, dass zum Zeitpunkt des Speicherns noch kein PK für 'Parent' bekannt ist, aber ich hoffte, dass Hibernate bzw. JPA das schon 'irgendwie' macht.
Ich befürchte, dass dieses Mapping in Verbindung mit einer Identity nicht zu lösen ist?
Leider habe ich keinen Einfluss mehr auf das Datenbank-Design.
Ziel sollte es sein, 'Child' bei jedem Anlegen eines neuen 'Parent' mit anzulegen und zur Verfügung zu haben beim Laden eines 'Parent'.
'Child' selbst wird 'heftigst' von anderen Prozessen (kein Java) geupdatet, d.h. es sollen keine Updates geschrieben/getätigt werden, wenn ich 'Parent' speichere.
Falls jemand eine Idee hat - auch gerne eine, wie ich das anders lösen kann - bin ich wirklich sehr dankbar.
Ich sitze nun schon seit Tagen an diesem Problem.
Festgefahren :(
Vielen Dank schon vorab!
Viele Gruesse
Gersch