hibernateを使用して挿入を呼び出すときに問題があります。外部キーは、OneToOne
マッピングで子に渡されていませんが、OneToMany
マッピングでは正常に動作しています。この例では挿入時にHibernate 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 (?)
呼び出す
にNULLを挿入することはできませんORA-01400:(。 "主" "SCHOOL_ID")
は、Schoolオブジェクトの外部キーが挿入されていないためです。 OneToMany
テーブルの外部キーが挿入される理由はわかりませんが、OneToOne
テーブルは挿入されません。誰もがこれを修正する方法を知っていますか?これらのテーブルは双方向です。
また、私はSchoolオブジェクトを取り込んでDBに保存するコントローラを持っています。私はこの学校のオブジェクトを受信したときにオブジェクトがこの
{
"name" : "data",
"students" : [ {"name", "data"}],
"principal" : {"name", "data"}
}
のように見える、私は子供をループしており、学校に親を設定するのですか?この例では2レベルしかないので、私は4-5レベルを作成する必要があり、親のそれぞれを設定するためにすべての方法でループしたくないからです。私は双方向性を使用する必要はありませんが、一方向性の場合はそうします。
'School' <->' Principal'はあなたの例でも、リレーショナルモデルでは双方向です。では、遅延制約を使用しないと、両側の外部キーはどのようにnull不可能になりますか? –