使用休眠調用插入時出現問題。外鍵沒有被傳遞給OneToOne
映射上的孩子,但它對OneToMany
映射工作正常。插入時休眠OneToOne雙向外鍵
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;
}
有了這個前充足的,當我試圖保存一個學校的對象時,冬眠將調用插入在學校,然後學生,然後校長。當它呼叫插入所有的學生,休眠電話
insert into STUDENT (SCHOOL_ID, STUDENT_ID) values (?, ?)
這是正確的。但是,當它試圖呼籲主要插入,Hibernate調用
insert into PRINCIPAL (PRINCIPAL_ID) values (?)
導致
ORA-01400:無法將NULL插入( 「校長」, 「學校ID」。)
,因爲沒有插入學校對象的外鍵。我不明白爲什麼它插入OneToMany
表的外鍵,但不插入OneToOne
表。有誰知道如何解決這一問題?這些表是雙向的。
此外,我有一個控制器,接受學校對象並保存到數據庫。物體看起來像這樣
{
"name" : "data",
"students" : [ {"name", "data"}],
"principal" : {"name", "data"}
}
當我收到這所學校的對象,我通過孩子有循環和設置父上學嗎?因爲在這個例子中它只有2個關卡,但我需要建立4-5個關卡,並且不想一直往下循環來設置每個父母。我不必使用雙向的,如果單向工作,我會這樣做。
'School' <->'Principal'是在關係模型也在你的榜樣雙向的。那麼如何在不使用延遲約束的情況下雙方的外鍵不可空? –