复合主键

指多个主键联合形成一个主键组合

需求产生

比如航线一般是由出发地及目的地确定,如果要确定唯一的航线就可以用出发地和目的地一起来表示

ddl语句

同复合主键-2个@Id一样

Airline

  1. package com.jege.jpa.composite;
  2. import java.io.Serializable;
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.Id;
  6. import javax.persistence.IdClass;
  7. import javax.persistence.Table;
  8. /**
  9. * @author JE哥
  10. * @email 1272434821@qq.com
  11. * @description:复合主键-2个@Id+@IdClass
  12. */
  13. @Entity
  14. @Table(name = "t_airline")
  15. @IdClass(Airline.AirlinePK.class)
  16. public class Airline {
  17. @Id
  18. private String startCity;
  19. @Id
  20. private String endCity;
  21. private String name;
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28. public String getStartCity() {
  29. return startCity;
  30. }
  31. public void setStartCity(String startCity) {
  32. this.startCity = startCity;
  33. }
  34. public String getEndCity() {
  35. return endCity;
  36. }
  37. public void setEndCity(String endCity) {
  38. this.endCity = endCity;
  39. }
  40. @Override
  41. public String toString() {
  42. return "Airline [startCity=" + startCity + ", endCity=" + endCity + ", name=" + name + "]";
  43. }
  44. // 必须static的class
  45. public static class AirlinePK implements Serializable {
  46. private static final long serialVersionUID = -7189167162738318201L;
  47. @Column(length = 3, nullable = false)
  48. private String startCity;
  49. @Column(length = 3, nullable = false)
  50. private String endCity;
  51. public AirlinePK() {
  52. }
  53. public AirlinePK(String startCity, String endCity) {
  54. this.startCity = startCity;
  55. this.endCity = endCity;
  56. }
  57. public String getStartCity() {
  58. return startCity;
  59. }
  60. public void setStartCity(String startCity) {
  61. this.startCity = startCity;
  62. }
  63. public String getEndCity() {
  64. return endCity;
  65. }
  66. public void setEndCity(String endCity) {
  67. this.endCity = endCity;
  68. }
  69. @Override
  70. public int hashCode() {
  71. final int prime = 31;
  72. int result = 1;
  73. result = prime * result + ((endCity == null) ? 0 : endCity.hashCode());
  74. result = prime * result + ((startCity == null) ? 0 : startCity.hashCode());
  75. return result;
  76. }
  77. @Override
  78. public boolean equals(Object obj) {
  79. if (this == obj)
  80. return true;
  81. if (obj == null)
  82. return false;
  83. if (getClass() != obj.getClass())
  84. return false;
  85. AirlinePK other = (AirlinePK) obj;
  86. if (endCity == null) {
  87. if (other.endCity != null)
  88. return false;
  89. } else if (!endCity.equals(other.endCity))
  90. return false;
  91. if (startCity == null) {
  92. if (other.startCity != null)
  93. return false;
  94. } else if (!startCity.equals(other.startCity))
  95. return false;
  96. return true;
  97. }
  98. @Override
  99. public String toString() {
  100. return "AirlinePK [startCity=" + startCity + ", endCity=" + endCity + "]";
  101. }
  102. }
  103. }

MainTest

  1. package com.jege.jpa.composite;
  2. import javax.persistence.EntityManager;
  3. import javax.persistence.EntityManagerFactory;
  4. import javax.persistence.Persistence;
  5. import org.junit.After;
  6. import org.junit.AfterClass;
  7. import org.junit.Before;
  8. import org.junit.BeforeClass;
  9. import org.junit.Test;
  10. import com.jege.jpa.composite.Airline.AirlinePK;
  11. /**
  12. * @author JE哥
  13. * @email 1272434821@qq.com
  14. * @description:复合主键-2个@Id+@IdClass测试
  15. */
  16. public class MainTest {
  17. private static EntityManagerFactory entityManagerFactory = null;
  18. private EntityManager entityManager = null;
  19. @BeforeClass
  20. public static void setUpBeforeClass() throws Exception {
  21. entityManagerFactory = Persistence.createEntityManagerFactory("com.jege.jpa");
  22. }
  23. @Before
  24. public void setUp() throws Exception {
  25. entityManager = entityManagerFactory.createEntityManager();
  26. }
  27. @Test
  28. public void persist() {
  29. Airline airline = new Airline();
  30. airline.setEndCity("SHA");
  31. airline.setStartCity("PEK");
  32. airline.setName("北京飞上海");
  33. entityManager.getTransaction().begin();
  34. entityManager.persist(airline);
  35. entityManager.getTransaction().commit();
  36. }
  37. @Test
  38. public void find() {
  39. persist();
  40. AirlinePK pk = new AirlinePK("PEK", "SHA");
  41. Airline airline = entityManager.find(Airline.class, pk);
  42. System.out.println(airline);
  43. }
  44. @After
  45. public void tearDown() throws Exception {
  46. if (entityManager != null && entityManager.isOpen())
  47. entityManager.close();
  48. }
  49. @AfterClass
  50. public static void tearDownAfterClass() throws Exception {
  51. if (entityManagerFactory != null && entityManagerFactory.isOpen())
  52. entityManagerFactory.close();
  53. }
  54. }

其他关联项目

源码地址

https://github.com/je-ge/jpa

如果觉得我的文章对您有帮助,请打赏支持。您的支持将鼓励我继续创作!谢谢!



JPA 系列教程12-复合主键-2个@Id+@IdClass的更多相关文章

  1. JPA 系列教程11-复合主键-2个@Id

    复合主键 指多个主键联合形成一个主键组合 需求产生 比如航线一般是由出发地及目的地确定,如果要确定唯一的航线就可以用出发地和目的地一起来表示 ddl语句 CREATE TABLE `t_airline ...

  2. JPA 系列教程13-复合主键-@EmbeddedId+@Embeddable

    复合主键 指多个主键联合形成一个主键组合 需求产生 比如航线一般是由出发地及目的地确定,如果要确定唯一的航线就可以用出发地和目的地一起来表示 ddl语句 同复合主键-2个@Id和复合主键-2个@Id+ ...

  3. Hibernate 系列教程8-复合主键

    复合主键 复合主键的意思就是2个字段同时为主键 不使用无业务含义的自增id作为主键 Airline package com.jege.hibernate.compositeid; import jav ...

  4. 【hibernate/JPA】注解方式实现 复合主键【spring boot】

    1>hibernate/JPA实现复合主键的思路:是将所有的主键属性封装在一个主键类中,提供给需要复合主键的实体类使用. 2>主键类的几点要求: . 使用复合主键的实体类必须实现Seria ...

  5. Hibernate复合主键映射

    目录: 1. 实现方式一:将复合主键对应的属性与实体其他普通属性放在一起 2. 实现方式二:将主键属性提取到一个主键类中,实体类只需包含主键类的一个引用 在日常开发中会遇到这样一种情况,数据库中的某张 ...

  6. JPA 系列教程9-双向一对一唯一外键

    双向一对一唯一外键的ddl语句 CREATE TABLE `t_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(25 ...

  7. SpringData JPA复合主键

    上一篇博客简单介绍了SpringData JPA实现简单的CRUD,分页与多条件的排序,那里的主键类型是Long,有时我们会遇到主键不是一个的,复合主键,经过调研如下.确定一个人,不能只根据他的姓名来 ...

  8. springboot jpa 复合主键

    https://blog.csdn.net/wyc_cs/article/details/9031991 创建一个复合主键类 public class LevelPostMultiKeysClass ...

  9. 【hibernate/JPA】对实体类的的多个字段建立唯一索引,达到复合主键的效果【spring boot】注解创建唯一索引和普通索引

    对实体类的的多个字段建立唯一索引,达到复合主键的效果 package com.sxd.swapping.domain; import lombok.Getter; import lombok.Sett ...

随机推荐

  1. Sql Server中三种字符串合并方法的性能比较

    文章来自:博客园-DotNet菜园 最近正在处理一个合并字符吕的存储过程,在一个测试系统的开发中,要使用到字符串合并功能,直接在Sql中做.示例:有表內容﹕名称  內容1     abc1      ...

  2. Linux 查公网出口IP

    wget http://members.3322.org/dyndns/getipcat getip

  3. Webdriver其他定位方式

    1.下拉框的定位 在遇到select下拉框的选择时,比如: <select id="nr" name="NR"> <option select ...

  4. java中转换json方式(JSONArray,JSONObject),json解析

    package com.yunos.tv.video.resource.controller.web; import java.util.ArrayList; import java.util.Has ...

  5. xshell 注册码

    Xshell 5 注册码: 101210-450789-147200Xftp 5 注册码:101210-450789-147200 Xmanager 5 注册码:101210-450789-14720 ...

  6. schema change + ogg 变更手册

    Check OGG  until no data queuing in replication process:testRO:a)login  test5 –l oggmgrb)oggc)#ggsci ...

  7. appium使用真机做安卓移动端自动化测试

    1.PC往手机上安装apk文件:adb install apk文件完整路径 2.获取app包名和activity的命令:使用aapt;aapt是sdk自带的一个工具,在sdk\builds-tools ...

  8. ubuntu 文件编码错误

    linux 打开出现中文编码错误(invalid encoding): convmv -f gbk -t utf-8 -r --notest /filename

  9. UEFI安装Win10

    启动方式: Legency UEFI 分区表类型: MBR 主引导记录 最多4个主分区 最大支持2.1T硬盘 GPT 基于可扩展固件接口(EFI) 分区数不限 NTFS格式最大支持256T硬盘 安装模 ...

  10. pdf 电子书分享

    http://yunpan.cn/cLgXntGmIas7A 访问密码 7d04 来自为知笔记(Wiz)