假定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