孙卫琴的《精通JPA与Hibernate》的读书笔记:用@OneToOne注解映射一对一关联

在以下图中,ADDRESSES表的ID字段既是主键,同时作为外键参照CUSTOMERS表的主键,也就是说,ADDRESSES表与CUSTOMERS表共享主键。
孙卫琴的《精通JPA与Hibernate》的读书笔记:用@OneToOne注解映射一对一关联
在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 ');

孙卫琴的《精通JPA与Hibernate》的读书笔记:用@OneToOne注解映射一对一关联

上一篇:JSON


下一篇:SQL Server CAST 转换double 类型 出现科学计数法