JPA一对一双向
这次,我们引用一个新的数据模型:丈夫(husband) 和 妻子(wife)。前提:众所周知,在我们伟大的祖国,法律上只存在一种婚姻关系,一夫一妻制。所以,一个丈夫只能有一个妻子,一个妻子也只有一个丈夫。(大家千万别较真,我已经限定了场景,法律上只允许一夫一妻。小三不在本例研究范围内)
对于这种数据模型来说,双向一对一关系已经很明显了。我们通过丈夫应该能找到他的妻子。同样,通过妻子,应该能找到她的丈夫。
好了,让我们来看例子吧:
@Entity
@Table(name = "husband")
public class Husband (){
@Id //JPA注释: 主键
@GeneratedValue(strategy = GenerationType.AUTO) //设置 id 为自增长
private Long id;
private String name;
//由于,husband 是这个一对一的关系的主控方,所以,在husband表中添加了一个 wife 的外键。
//通过这个外键来维护 people和pet的一对一关系,而不是用第三张码表。这个是通过@JoinColumn注释实现的。
@OneToOne //JPA注释: 一对一 关系
@JoinColumn(name="wife_fk" )// 在husband中,添加一个外键 "wife_fk"
private Wife wife;
//省略 get / set 方法...
}
@Entity
@Table(name = "wife")
public class Wife (){
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
//注意:由于是双向的一对一关系。作为关系的被维护端。需要在wife实体中添加和 husband 关联的属性
//mappedBy 注释:指定了,这个实体是被关系维护端的那个属性所维护。
//在本例中,Wife实体是被 Hhusband实体中的外键“wife”所维护。
@OneToOne(mappedBy="wife")
private Husband husband;
//省略 get / set 方法...
}
那么,现在已经很明显了。在Wife 的 Model 中,已经找到了与 Husband 关联的属性了。但是,如果进入到数据库中查看Wife这张表,你并不会在表里找到关联到Husband的外键。为什么会这样呢?因为,我们定义关系的时候,规定了关系的维护端是Husband。所以,只有Husband中有管理到Wife的外键。而这个一对一关系,就是靠这个外键来维护的。那当我们设置了,mappedBy后,使关系成为双向的时候,是怎样通过Wife实体来得到她对应的Husband实体的呢?这都是由JPA来做的。我们不必在这上面花费过多的精力。如果,你感兴趣,也可以自己研究思考一下。