2016-03-31 12 views
0

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 (?) 

呼び出す

ORA-01400:(。 "主" "SCHOOL_ID")

にNULLを挿入することはできません

は、Schoolオブジェクトの外部キーが挿入されていないためです。 OneToManyテーブルの外部キーが挿入される理由はわかりませんが、OneToOneテーブルは挿入されません。誰もがこれを修正する方法を知っていますか?これらのテーブルは双方向です。

また、私はSchoolオブジェクトを取り込んでDBに保存するコントローラを持っています。私はこの学校のオブジェクトを受信したときにオブジェクトがこの

{ 
    "name" : "data", 
    "students" : [ {"name", "data"}], 
    "principal" : {"name", "data"} 
} 

のように見える、私は子供をループしており、学校に親を設定するのですか?この例では2レベルしかないので、私は4-5レベルを作成する必要があり、親のそれぞれを設定するためにすべての方法でループしたくないからです。私は双方向性を使用する必要はありませんが、一方向性の場合はそうします。

+0

'School' <->' Principal'はあなたの例でも、リレーショナルモデルでは双方向です。では、遅延制約を使用しないと、両側の外部キーはどのようにnull不可能になりますか? –

答えて

0

PrincipalクラスでOneToOne注釈にmappedByを追加します。

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

お返事ありがとうございました。私はそれを試みましたが、うまくいきませんでした。これを含めるように質問を更新しました。 –