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

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

一、一对一(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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值