|  | 本文参考《精通JPA与Hibernate:Java对象持久化技术详解》,作者:孙卫琴,清华大学出版社出版 
 假定Person类和PersonDetail类为一对一关联关系,相应的,PERSONS表和PERSON_DETAILS表为一对一参照关系。PERSON_DETAILS表的ID字段既是主键,又作为外键参照PERSONS表的ID主键,因此,PERSON_DETAILS表的ID主键实际上来自于PERSONS表的ID主键。PERSON_DETAILS表的ID主键称为派生主键。
 
 Person类的定义如下:
 | @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属性。
 
 
 | @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定义语句如下:
 
 
 | 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对象,再对它们持久化:
 
 
 | 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标识符。以上代码的打印结果如下:
 
 Person ID:8
 PersonDetail ID:8
 
 
  
 
 
 
 程序猿的技术大观园:www.javathinker.net
 
 
 
 
 
 [这个贴子最后由 admin 在 2021-10-09 10:44:15 重新编辑]
 |  |