>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 15100 个阅读者 刷新本主题
 * 贴子主题:  【持久化专题】用@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面向对象编程-->内部类
  JavaWeb开发-->自定义JSP标签(Ⅱ)
  JSP与Hibernate开发-->数据库事务的并发问题的解决方案
  Java网络编程-->基于MVC和RMI的分布式应用
  精通Spring-->Vue指令
  Vue3开发-->Vue指令
  【Vue.js技术专题】命名路由
  【Vue.js技术专题】在Vue项目中使用Axios
  【Spring Cloud Alibaba专题】GateWay的内置断言工厂
  【Spring Cloud Alibaba专题】GateWay与Nacos整合
  【Spring Cloud Alibaba专题】Nacos配置属性的持久化
  【Java基础编程专题】使用和创建JavaDoc文档
  【Spring专题】Spring框架的数据验证机制
  【持久化专题】映射一对多双向关联关系
  【持久化专题】Hibernate的配置文件
  【持久化专题】EntityManager和Session的merge()方法详解
  【Java编程基础专题】用Scanner类读取用户在控制台输入的数据
  【Java网络编程专题】用Java套接字访问HTTP服务器读取网页数...
  IT技术书写作技巧分享:慎用概念和术语
  【JavaWeb专题】选择32位或64位JDK或者Apache HTTP服务器的安...
  【Java基础编程专题】Java集合与数组的互换
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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