(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;
}
}