孙卫琴的《精通JPA与Hibernate》的读书笔记:用@MapsId注解映射派生主键

假定Person类和PersonDetail类为一对一关联关系,相应的,PERSONS表和PERSON_DETAILS表为一对一参照关系。PERSON_DETAILS表的ID字段既是主键,又做为外键参照PERSONS表的ID主键,所以,PERSON_DETAILS表的ID主键实际上来自于PERSONS表的ID主键。PERSON_DETAILS表的ID主键称为派生主键。java

Person类的定义以下:markdown

@Entity
@Table(name="PERSONS")
public static class Person  {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)  
  @Column(name="ID")
  private Long id;

  @Column(name="NAME")
  private String name;
  ……
}

在如下PersonDetail类中,person属性使用了@MapsId注解,代表PersonDetail类的id属性的值来自于person属性所引用的Person对象的id属性。ide

@Entity
@Table(name="PERSON_DETAILS")
public static class PersonDetail  {
  @Id
  @Column(name="ID")
  private Long id;

  @OneToOne
  @JoinColumn(name=" ID")  
  @MapsId
  private Person person;

  @Column(name="NICK_NAME")
  private String nickName;   
  ……   
}

PERSON表和PERSON_DETAILS表的DDL定义语句以下:atom

create table PERSONS (ID bigint not null auto_increment,
            NAME varchar(15),primary key (ID));
create table PERSON_DETAILS (ID bigint not null,
            NICK_NAME varchar(15),primary key (ID));

alter table PERSON_DETAILS add index IDX_PERSON (ID), 
add constraint FK_PERSON foreign key(ID) references PERSONS(ID);

如下代码先建立一个Person对象和PersonDetail对象,再对它们持久化:spa

Person person = new Person("Tom");
PersonDetail personDetail = new PersonDetail();
personDetail.setNickName( "SunShine" );
personDetail.setPerson( person );
……
entityManager.persist( person );
entityManager.persist( personDetail );
System.out.println("Person ID:"+person.getId());
System.out.println("PersonDetail ID:"+personDetail.getId());

以上Person对象的id标识符经过identity标识符生成器产生,而PersonDetail对象的id标识符来自于Person对象的id标识符。以上代码的打印结果以下:code

Person ID:8
PersonDetail ID:8

在这里插入图片描述

相关文章
相关标签/搜索