(3)OneToOne简单外键关联

一、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;
    }
}
posted @ 2017-11-12 11:55  测试开发分享站  阅读(173)  评论(0编辑  收藏  举报