下述所有的关系都由外键控制,且都为双向关系。
一、一对一(OneToOne)
1.一方(被拥有方,也就是没有外键方)
private Transcript transcript;
@OneToOne(mappedBy="studentOwner",fetch=FetchType.LAZY,cascade=CascadeType.MERGE)
public Transcript getTranscript() {
return transcript;
}
public void setTranscript(Transcript transcript) {
this.transcript = transcript;
}
2.一方(拥有方,拥有外键方)
private Student studentOwner;//学生
@OneToOne(fetch=FetchType.LAZY,cascade=CascadeType.MERGE)
@JoinColumn(name = "student_id",referencedColumnName="id")
public Student getStudentOwner() {
return studentOwner;
}
public void setStudentOwner(Student studentOwner) {
this.studentOwner = studentOwner;
}
二、一对多(OneToMany)
1. 一方(没有外键方)
private Set<TranscriptEntry> transcriptEntries=new HashSet<TranscriptEntry>();//成绩列表
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.MERGE,mappedBy="transcript")
public Set<TranscriptEntry> getTranscriptEntries() {
return transcriptEntries;
}
public void setTranscriptEntries(Set<TranscriptEntry> transcriptEntries) {
this.transcriptEntries = transcriptEntries;
}
2. 多方(拥有外键方)
private Transcript transcript;
@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.MERGE)
@JoinColumn(name="transcript_id",referencedColumnName="id")
public Transcript getTranscript() {
return transcript;
}
public void setTranscript(Transcript transcript) {
this.transcript = transcript;
}
三、两张表多对多(ManyToMany)
多对多关系原理就是添加第三张表管理两者直接的关系。
1、多方1
private Set<Domain>domain=new HashSet<Domain>();
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "pre_domain_preplan",
joinColumns = {@JoinColumn(name = "preplan_sn", referencedColumnName = "preplan_sn")},
inverseJoinColumns = {@JoinColumn(name = "domain_sn", referencedColumnName ="domain_sn")})
public Set<Domain> getDomain() {
return domain;
}
public void setDomain(Set<Domain> domain) {
this.domain = domain;
}
2、多方2
private Set<Preplan> preplan=new HashSet<Preplan>();
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "pre_domain_preplan",
joinColumns = {@JoinColumn(name = "domain_sn", referencedColumnName = "domain_sn")},
inverseJoinColumns = {@JoinColumn(name = "preplan_sn", referencedColumnName ="preplan_sn")})
public Set<Preplan> getPreplan() {
return preplan;
}
public void setPreplan(Set<Preplan> preplan) {
this.preplan = preplan;
}
3、操作第三方表
如何保存、移除二者的关系
//保存二者关系
Preplan ppModel=new Preplan();
Domain dmModel =new Domain();
dmModel.setDomainSn(ppType);
if(dmModel!=null&&ppModel!=null){
Set<Domain> set = new HashSet<Domain>();
set.add(dmModel);
ppModel.setDomain(set);
}
三、自身多对多(ManyToMany)
private Set<Course> prerequisites=new HashSet<Course>() ;//先修课程 (自身多对多关系)
private Set<Course> postCondition=new HashSet<Course>() ;//后修课程(自身多对多关系)
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name ="course_pre_post",
joinColumns = {@JoinColumn(name = "post_condition_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "prerequisites_id", referencedColumnName ="id")})
public Set<Course> getPrerequisites() {
return prerequisites;
}
public void setPrerequisites(Set<Course> prerequisites) {
this.prerequisites = prerequisites;
}
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "course_pre_post",
joinColumns = {@JoinColumn(name = "prerequisites_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "post_condition_id", referencedColumnName ="id")})
public Set<Course> getPostCondition() {
return postCondition;
}
public void setPostCondition(Set<Course> postCondition) {
this.postCondition = postCondition;
}