在以下图中,ADDRESSES表的ID字段既是主键,同时作为外键参照CUSTOMERS表的主键,也就是说,ADDRESSES表与CUSTOMERS表共享主键。
在Customer类中,也是用@OneToOne注解来映射homeAddress属性:
@OneToOne(
cascade=CascadeType.ALL,
mappedBy="customer"
)
private Address homeAddress;
在Customer类与Address类的双向一对一关联关系中,由Address类作为主动方,来维护关联关系,它所对应的ADDRESSES表的ID键会参照CUSTOMERS表。Customer类是被动方,因此以上@OneToOne注解设置了mappedBy属性。
在Address类中,用@OneToOne注解来映射customer属性,并且在映射id属性时没有指定对象标识符生成策略:
@Id
@Column(name="ID")
private Long id;
@OneToOne(optional=false)
@JoinColumn(name=" ID")
@MapsId
private Customer customer;
以上@MapsId注解表明ADDRESSES表的ID主键是由CUSTOMERS表的主键决定的,所以ADDRESSES表不需要单独生成主键。
对于以下代码:
tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(customer);
tx.commit();
当EntityManager的persist()方法向CUSTOMERS表插入一条记录,同时还会向ADDRESSES表插入一条记录,执行如下insert语句:
insert into CUSTOMERS (ID,NAME)values (1, 'Tom');
insert into ADDRESSES(ID,CITY,STREET,PROVINCE,ZIPCODE)
values (1, 'city1', 'street1', 'province1', '100001 ');