Hibernate关系(双向一对一、一对多、多对多和自身多对多)映射注解整理

来源:互联网 发布:伺服电机plc编程 编辑:程序博客网 时间:2024/06/07 10:56

下述所有的关系都由外键控制,且都为双向关系。

一、一对一(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;    }
阅读全文
0 0