2016-03-31 106 views
0

使用休眠調用插入時出現問題。外鍵沒有被傳遞給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個關卡,並且不想一直往下循環來設置每個父母。我不必使用雙向的,如果單向工作,我會這樣做。

+0

'School' <->'Principal'是在關係模型也在你的榜樣雙向的。那麼如何在不使用延遲約束的情況下雙方的外鍵不可空? –

回答

0

添加的mappedBy在主類中的OneToOne註釋:

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

感謝您的回覆,我試過了,它沒有工作。我更新了這個問題。 –