>>分享孙卫琴的Java技术专稿和著作 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 14944 个阅读者 刷新本主题
 * 贴子主题:  【持久化专题】用@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开发-->开发JavaMail Web应用
  JSP与Hibernate开发-->映射对象标识符
  Java网络编程-->对象的序列化与反序列化
  精通Spring-->Vue Router路由管理器
  Vue3开发-->Vue CLI脚手架工具
  【Vue.js技术专题】路由管理器的基本用法
  【Spring Cloud Alibaba专题】SkyWalking整合MySQL
  【Spring专题】用AOP和SLF4J输出日志的范例
  【持久化专题】@Enumerated注解映射枚举类型
  【持久化专题】@Access注解设定Hibernate访问类的属性的方式
  【持久化专题】JPA API的基本用法
  【持久化专题】FetchType.LAZY延迟检索策略
  【Java编程基础专题】用Scanner类读取用户在控制台输入的数据
  【Java网络编程专题】用Apache FTPClient在FTP服务器上创建目...
  【Java网络编程专题】用Apache HttpClients下载网上的图片等...
  【Java网络编程专题】创建基于SSL的安全服务器和安全客户的范...
  【Java网络编程专题】用Java套接字编写基本的客户/服务器程序
  【JavaWeb专题】在JavaWeb应用中对客户请求的异步处理
  【JavaWeb专题】在Servlet中利用Apache开源类库实现文件上传
  【Java基础编程专题】Java集合与数组的互换
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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