|
本文参考《精通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 重新编辑]
|
|