建立实体Bean之间的一对一的关联可以使用@OneToOne注解。一对一关联有以下三种方式:
(1) 关联的实体都共享同样的主键;
(2) 二是其中一个实体通过外键关联到另一个实体的主键 ;
(3) 三是通过关联表来保存两个实体之间的连接关系。
下面就是一个通过共享主键来进行一对一关联映射的例子,代码如下:
@Entity public class Person { @Id public Long getId() { return id; } @OneToOne(cascade = CascadeType.ALL) @PrimaryKeyJoinColumn public IDcard getIdcard() { return idcard; } ... } |
上面定义了一个Person类,一个人对应一个身份证类IDcard,该类的实现代码如下:
@Entity public class IDcard { @Id public Long getId() { ...} } |
在上面例子中,通过使用注解@PrimaryKeyJoinColumn定义了一对一关联。
下面这个例子使用外键列进行实体的关联,代码如下:
@Entity public class Customer implements Serializable { @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name="passport_fk") public Passport getPassport() { ... }
@Entity public class Passport implements Serializable { @OneToOne(mappedBy = "passport") public Customer getOwner() { ... } |
在上面这个例子中,Customer 通过Customer 表中名为的passport_fk 外键列和 Passport关联, @JoinColumn注解定义了联接列,该注解和@Column注解有点类似, 但是多了一个名为referencedColumnName的参数, 该参数定义了所关联目标实体中的联接列。
作者提示:当referencedColumnName关联到非主键列的时候,关联的目标类必须实现Serializable,还要注意的是所映射的属性对应单个列(否则映射无效)。
一对一关联可能是双向的,在双向关联中, 有且仅有一端是作为主体(owner)端存在的。主体端负责维护联接列(即更新),对于不需要维护这种关系的从表则通过mappedBy属性进行声明。mappedBy的值指向主体的关联属性。 在上面这个例子中,mappedBy的值为 passport。如果在主体没有声明@JoinColumn,系统自动进行处理。 在主表中将创建联接列, 列名为主体的关联属性名+下划线+被关联端的主键列名。 在上面这个例子中是passport_id, 因为Customer中关联属性名为passport, Passport的主键是id。