其他分享
首页 > 其他分享> > 孙卫琴的《精通JPA与Hibernate》的读书笔记:用@OneToOne注解映射一对一关联

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

作者:互联网

在以下图中,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 ');

在这里插入图片描述

标签:CUSTOMERS,Hibernate,ADDRESSES,读书笔记,主键,注解,ID,OneToOne
来源: https://blog.51cto.com/sunweiqin/2753901