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来做的。我们不必在这上面花费过多的精力。如果,你感兴趣,也可以自己研究思考一下。 
原文地址:https://www.cnblogs.com/MAPO/p/8510268.html