2016-03-31 16 views
0

Hazırda bekletme özelliğini kullanarak araya girerken bir sorun yaşıyorum. Yabancı anahtar, OneToOne eşlemelerinde çocuğa aktarılmıyor, ancak OneToMany eşlemeleri için çalışıyor.Hazırda bekletme OneToOne çift yönlü yabancı anahtar ekleme

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; 
} 

bu eski ile 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; 
} 

Bir okul nesnesini kaydetmeye çalıştığımda, hazırda bekletme Okulu, ardından Öğrenciler, sonra Müdür'ü arayacaktı. Tüm öğrencilere eklendiğinde, doğru olan çağrıları

. o ana para insert çağırmak çalıştığında Ama hazırda neden

insert into PRINCIPAL (PRINCIPAL_ID) values (?) 

çağırır

ORA-01400: (. "ESAS" "school_id")

içine NULL ekleyemezsiniz

Okul nesnesinin yabancı anahtarının eklenmemesi nedeniyle. Neden OneToMany tabloları için yabancı anahtar ekler, ancak OneToOne tabloları anlamıyorum. Bunu nasıl düzelteceğini bilen var mı? Bu tablolar iki yönlüdür.

Ayrıca, Okul nesnesini alan ve DB'ye kaydedilen bir denetleyicim var. Bu okul nesnesini aldığınızda nesne, bu

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

benziyor ben çocuğa döngü var ve okula ebeveyni ayarlarım? çünkü bu örnekte sadece 2 seviye var, ama 4-5 seviyelerini inşa etmem gerekecek ve ebeveynlerin her birini ayarlamak için tüm yol boyunca dönmeyi istemem. İki yönlü kullanmam gerekmiyor, tek yönlü çalışma ise bunu yapardım.

+0

'Okul <-> 'Principal' sizin örnekte de ilişkisel modelde iki yönlüdür. Öyleyse, iki taraftaki yabancı anahtarlar ertelenmiş kısıtlamaları kullanmadan null olamaz? –

cevap

0

Principal sınıfta OneToOne ek nota mappedBy ekleyin:

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

Yanıt için teşekkürler, bunu denedim ve işe yaramadı. Bunu dahil etmek için soruyu güncelledim. –

İlgili konular