>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 24516 个阅读者 刷新本主题
 * 贴子主题:  【持久化专题】用@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开发-->Web运作原理(Ⅰ)
  JSP与Hibernate开发-->Spring、JPA与Hibernate的整合
  Java网络编程-->通过JDBC API访问数据库
  精通Spring-->虚拟DOM和render()函数
  Vue3开发-->通过Axios访问服务器
  【Vue.js技术专题】Vue组件的命名规则
  【Vue.js技术专题】插槽slot的基本用法
  【Vue.js技术专题】组件的递归
  【Spring Cloud Alibaba专题】Nacos配置属性的持久化
  【持久化专题】为什么JPA和Hibernate的持久化方法都抛出运行...
  探讨IT技术作者的素养
  【Vue专题】Vue组件的CSS过渡模式
  【Vue专题】Vue3的计算属性实用范例:实现购物车
  【持久化专题】JPA的事件处理API的用法
  【Java编程基础专题】用Scanner类读取用户在控制台输入的数据
  【Java网络编程专题】创建基于SSL的安全服务器和安全客户的范...
  【Java网络编程专题】通过JDBC API调用存储过程
  【持久化专题】比较JPA的EntityManager接口与Hibernate的Ses...
  IT技术书写作技巧分享:慎用概念和术语
  IT培训课、视频教程和书本之PK
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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