欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(3)OneToOne简单外键关联

程序员文章站 2022-03-03 20:01:37
...

一、OneToOne单向外键关联
**解释单向:
在本例中,husband类中有wife对象(映射到表中是husband中有wife的外键),在数据库获取husband时,会获取到wife,即husband知道谁是它的wife;当在数据库获取wife时,并不知道它的husband是谁**
①Husband

/*
 * 在生成的husband表中,主键是id  外键是wife中的id(wifeid)
 */
@Entity
public class Husband {

    private int id;
    private String name;
    private int age;
    private Wife wife;

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    @OneToOne//Husband 与Wife 是一一对应关系[说明wife是主表,husband是从表。因为husband参照wife]
    //@JoinColumn(name="wifeId")//当两个表建立联系时,hibernate会在husband表中加外键(在这个一一对应关系中,wife是主表),其名为wife_id。可以改变其名称
    public Wife getWife() {
        return wife;
    }
    public void setWife(Wife wife) {
        this.wife = wife;
    }

②Wife


@Entity
public class Wife {

    private int id;
    private String name;
    private int age;

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }   
}

@JoinColumn:若husband中只写了@OneToOne,不写@JoinColumn,系统会自动进行处理。在主表中将创建联接列,列名为:主体的关联属性名+下划线+被关联端列名。
比如Wife类中的主键为wid 在husband中private Wife wi 则自动生成的是:wi_wid

二、OneToOne双向外键关联
解释双向:在实际需求中,很可能在访问husband时,需要用到wife。访问wife时需要用到husband,所以在类设计中设置双向关联,这样无论获取哪段都可以获取另一端。一对一双向关联中,有且仅有一端作为主体存在:主体负责维护连接表,对于不需要维护这种关系的从表则通过mappedBy属性进行声明。mappedBy的值指向主体的关联属性(而不是对应数据表中列名)。若husband表中private Wife wi 则在Wife表中@OneToOne(mappedBy=”wi”)
//Husband表和一表同

@Entity
public class Wife {

    private int id;
    private String name;
    private Husband husband;

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }


    @OneToOne(mappedBy="wife")
    /*
     * 当一对一外键时,husband、wife中均有对应时,两边都可以写@OneToOne,但是若都这样写,会造成两个表分别有wife_id、husband_id 这会造成数据冗余,表设计的不合理
     * 为了避免这种情况,加属性mappedBy="wife" 相当于wife是主表,这个OneToOne 不用管 也就是这里OneToOne不起作用,相当于一个标识
     * 所以,以后在两个表一一双向关联时,其中一个表必须有mappedBy
     * 
     */
     public Husband getHusband() {
        return husband;
    }
    public void setHusband(Husband husband) {
        this.husband = husband;
    }
}
相关标签: 数据库 对象