2016-03-31 20 views
0

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.

+0

'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? –

Antwort

0

hinzufügen mappedBy zur OneToOne Anmerkung in Hauptklasse:

@OneToOne(mappedBy="principal", fetch = FetchType.LAZY) 
+0

danke für die Antwort, ich habe das versucht und es hat nicht funktioniert. Ich habe die Frage aktualisiert, um dies zu berücksichtigen. –

Verwandte Themen