>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 15101 个阅读者 刷新本主题
 * 贴子主题:  【持久化专题】用@MapsId注解映射派生主键 回复文章 点赞(0)  收藏  
作者:sunweiqin    发表时间:2021-05-05 09:42:23     消息  查看  搜索  好友  邮件  复制  引用

本文参考《精通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

         点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小




程序猿的技术大观园:www.javathinker.net





[这个贴子最后由 admin 在 2021-10-09 10:44:15 重新编辑]
  Java面向对象编程-->Swing组件(下)
  JavaWeb开发-->Web运作原理(Ⅰ)
  JSP与Hibernate开发-->立即检索和延迟检索策略
  Java网络编程-->用Spring整合CXF发布Web服务
  精通Spring-->Vue CLI脚手架工具
  Vue3开发-->Vue简介
  【Vue.js技术专题】Vue组件的数据监听
  【Vue.js技术专题】路由导航中抓取数据
  【Vue.js技术专题】在Vue项目中使用Axios
  【Vue.js技术专题】Vuex中异步操作
  【Spring Cloud Alibaba专题】GateWay与Nacos整合
  【Spring专题】用Spring框架进行文件下载
  【Spring专题】RestTemplate类与RESTFul风格的请求
  从《精通Spring》和《精通Vue.js》的写作分享学习新技术的经...
  【持久化专题】JPA API的级联操作
  【Java网络编程专题】异步通道和异步运算结果
  IT技术书写作技巧分享:慎用概念和术语
  《大话Java程序设计从入门到精通》写作花絮
  【Java基础编程专题】用static修饰符进行静态导入的作用和语...
  我的计算机书籍创作心得
  IT培训课、视频教程和书本之PK
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。