Ich habe ein Problem beim Aufruf von Insert mit Hibernate. Der Fremdschlüssel wird nicht an das untergeordnete Element in den OneToOne
Zuordnungen übergeben, aber es funktioniert gut für die OneToMany
Zuordnungen.Hibernate OneToOne bidirektionaler Fremdschlüssel beim Einfügen
School.java
private long schoolId;
private set<Student> students;
private Principal principal;
@Id
@Column(name = "SCHOOL_ID", unique = true, nullable = false, precision = 15, scale = 0)
public long getSchoolId() {
return schoolId;
}
public void setSchoolId(long schoolId) {
this.schoolId = schoolId;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "school")
public set<Student> getStudents() {
return students;
}
public void setStudents(set<Student> students) {
this.students = students;
}
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "school")
public Principal getPrincipal() {
return principal;
}
public void setPrincipal(Principal principal) {
this.principal = principal;
}
Student.java
private long studentId;
private School school;
other data....
@Id
@Column(name = "STUDENT_ID", unique = true, nullable = false, precision = 15, scale = 0)
public long getStudentId() {
return studentId;
}
public void setStudentId(long studentId) {
this.studentId = studentId;
}
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SCHOOL_ID", nullable = false)
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
Principal.java
private long principalId;
private School school;
//other data....
@Id
@Column(name = "PRINCIPAL_ID", unique = true, nullable = false, precision = 15, scale = 0)
public long getPrincipalId() {
return principalId;
}
public void setPrincipalId(long principalId) {
this.principalId = principalId;
}
@JsonIgnore
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "SCHOOL_ID", nullable = false)
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
Mit diesem ex Wenn ich versuche, ein Schulobjekt zu speichern, würde der Winterschlaf die Einfügung in die Schule, dann in die Schüler, dann in den Schulleiter rufen. Wenn es an allen Schülern einfügen aufruft, Anrufe im Ruhezustand
insert into STUDENT (SCHOOL_ID, STUDENT_ID) values (?, ?)
, die korrekt ist. Aber wenn er versucht Einsatz auf dem Prinzip zu nennen, Hibernate ruft
insert into PRINCIPAL (PRINCIPAL_ID) values (?)
, die bewirkt, dass
ORA-01400: kann nicht NULL einfügen in ("principal" "SCHOOL_ID".)
, da der Fremdschlüssel für das School-Objekt nicht eingefügt wird. Ich verstehe nicht, warum es den Fremdschlüssel für die OneToMany
Tabellen, aber nicht die OneToOne
Tabellen einfügt. Kann jemand das beheben? Diese Tabellen sind bidirektional.
Auch ich habe einen Controller, der das School-Objekt aufnimmt und in DB speichert. Das Objekt sieht wie folgt aus
{
"name" : "data",
"students" : [ {"name", "data"}],
"principal" : {"name", "data"}
}
, wenn ich diese Schule Objekt erhalten, muss ich durch das Kind Schleife und legen Sie die Eltern in die Schule? denn in diesem Beispiel sind es nur 2 Ebenen, aber ich müsste 4-5 Ebenen erstellen und möchte nicht ganz nach unten gehen, um alle Eltern festzulegen. Ich muss nicht bidirektional arbeiten, wenn ich in eine Richtung arbeite, würde ich das tun.
'School' <->' Principal' ist bidirektional in dem relationalen Modell auch in Ihrem Beispiel. Wie können also Fremdschlüssel auf beiden Seiten ohne Verwendung von verzögerten Einschränkungen nicht nullbar gemacht werden? –