有时一个实体的主键可能同时为多个,例如同样是之前使用的“CustomerEO”实体,需要通过name和email来查找指定实体,当且仅当name和email的值完全相同时,才认为是相同的实体对象。要配置这样的复合主键,步骤如以下所示。

(1)编写一个复合主键的类CustomerPK,代码如下。

CustomerPK.java

import java.io.Serializable;

public class CustomerPK implements Serializable {

         public CustomerPK() {

 

         }

public CustomerPK(String name, String email) {

this.name = name;

this.email = email;

}

private String email;

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

         public int hashCode() {

                   final int PRIME = 31;

                   int result = 1;

                   result = PRIME * result + ((email == null) ? 0 : email.hashCode());

                   result = PRIME * result + ((name == null) ? 0 : name.hashCode());

                   return result;

         }

@Override

         public boolean equals(Object obj) {

                   if (this == obj)

                            return true;

                   if (obj == null)

                            return false;

                   if (getClass() != obj.getClass())

                            return false;

                   final CustomerPK other = (CustomerPK) obj;

                   if (email == null) {

                            if (other.email != null)

                                     return false;

                   } else if (!email.equals(other.email))

                            return false;

                   if (name == null) {

                            if (other.name != null)

                                     return false;

                   } else if (!name.equals(other.name))

                            return false;

                   return true;

         }

}

作为符合主键类,要满足以下几点要求。

l         必须实现Serializable接口。

l         必须有默认的public无参数的构造方法。

l         必须覆盖equals和hashCode方法。equals方法用于判断两个对象是否相同,EntityManger通过find方法来查找Entity时,是根据equals的返回值来判断的。本例中,只有对象的name和email值完全相同时或同一个对象时则返回true,否则返回false。hashCode方法返回当前对象的哈希码,生成的hashCode相同的概率越小越好,算法可以进行优化。

(2)通过@IdClass注释在实体中标注复合主键,实体代码如下。

@Entity

@Table(name = "customer")

@IdClass(CustomerPK.class)

public class CustomerEO implements java.io.Serializable {

private Integer id;

public Integer getId() {

return this.id;

}

public void setId(Integer id) {

this.id = id;

}

private String name;

@Id

public String getName() {

return this.name;

}

public void setName(String name) {

this.name = name;

}

private String email;

@Id

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

}

标注复合主键时需要注意以下几个问题。

l         @IdClass标注用于标注实体所使用主键规则的类。它的定义如下所示。

@Target({TYPE}) @Retention(RUNTIME)

public @interface IdClass {

Class value();

}

属性Class表示符合主键所使用的类,本例中使用CustomerPK这个复合主键类。

l         在实体中同时标注主键的属性。本例中在email和name的getter方法前标注@Id,表示符合主键使用这两个属性。

(3)这样定义实体的复合主键后,通过以下代码便可以获得指定的实体对象:

CustomerPK cpk = new CustomerPK("Janet","janetvsfei@yahoo.com.cn");

CustomerEO instance = entityManager.find(CustomerEO.class, cpk);

复合主键@IdClass相关推荐

  1. Hibernate JPA-实体类定义联合主键@IdClass、@EmbeddedId注解

    文章目录 一.复合主键@idClass.@Embeddable @idClass @Embeddable 网上实例demo 二.参考 一.复合主键@idClass.@Embeddable 可参照官方文 ...

  2. springboot jpa 复合主键 联合主键

    为什么80%的码农都做不了架构师?>>>    在开发中,数据库中定义了一个复合主键,这时候在映射不稍微处理下会有一点问题.什么does not define an IdClass错 ...

  3. JPA复合主键的使用

    背景 人员信息和组信息的关联表中使用的USER_ID_和GROUP_ID_的联合主键,在维护组人员信息的时候,发现JPA打印的SQL只根据USER_ID_作为条件来更新数据,当B组存在zhangsan ...

  4. java 复合主键,Spring Data Jpa 复合主键的实现

    前言 这次大创有个需求,在数据库建表时发现,user表与project表的关系表 user_project的主键为复合主键: CREATE TABLE user_project( user_id IN ...

  5. java复合主键注解_hibernate注解方式实现复合主键

    有时一个实体的主键可能同时为多个,例如同样是之前使用的"CustomerEO"实体,需要通过name和email来查找指定实体,当且仅当name和email的值完全相同时,才认为是 ...

  6. mapper中mysql复合语句_MyBatis定义复合主键

    前为别名后为主查询getXXX语句中字段 SELECT colid,colname FROM table1 SELECT * FROM table2 WHERE id = #{id} AND name ...

  7. SpringData JPA复合主键

    一.JPA和复合主键的简介        JPA全称Java Persistence API,是一组用于将数据存入数据库的类和方法的集合.JPA通过JDK5.0注解或XML描述对象-关系表的映射关系, ...

  8. JPA之使用复合主键

    文章目录 1. 目标 2. 数据库设计 3. Entity 定义 4. 使用 5. 源码 1. 目标 在设计数据库表的时候,有时候不想定义没有意义的Id作为主键,就可以使用复合主键.这个时候使用JPA ...

  9. Oracle-No.04 Oracle视图加主键解决hibernate复合主键问题

    2019独角兽企业重金招聘Python工程师标准>>> Oracle视图默认是没有主键的,因此在用hibernate反向生成java类时,会自动采用复合主键,多生成一个类名+ID的类 ...

最新文章

  1. 从一张风景照中就学会的SinGAN模型,究竟是什么神操作?| ICCV 2019最佳论文
  2. 网站SEO优化、IIS日志分析工具 IISLogViewer V2.0 发布
  3. [公告] TechNet / MSDN 经理人博客上周移机整合暂断
  4. Ubuntu16.04(64位)下面使用Doxygen+Graphviz分析python代码
  5. java解析表字段_从SQL / HQL Java解析表和列名
  6. 需要额外端口信息_NR逻辑天线端口介绍
  7. java exec 关闭,Java学习之使用Runtime.exec()启动、关闭Tomcat
  8. 众包专访:告别接包黑历史,来到开源中国众包接包小记
  9. RegSetValueEx 计算WCHAR字符长度 wcslen
  10. Java集合相关面试题总结
  11. Cgroup 资源配置方法----------Control Groups------Docker通过 Cgroup 来控制容器使用的资源配额
  12. jquery Ajax回调函数
  13. 西游记中托塔李天王的三个儿子,一个女儿和一个干女儿
  14. 树莓派-10-安装jupyter并控制SG90舵机
  15. APK安装包如何安装到安卓手机上
  16. openvino只支持英特尔6代以上的cpu
  17. 蛋蛋弹车3-具有功能安全EPS系统设计(电机控制算法-PID)
  18. matlab存储excel数据,怎么把matlab表格数据写入excel-怎么把matlab中处理的数据存入到excel中...
  19. xcode打包优化级别设置
  20. SGM4808YTQA16G/TR

热门文章

  1. 安装 | VMware Workstation Pro 16 for Unbuntu 20.10 虚拟机安装教程
  2. 模糊搜索时搜索结果中关键词变为不同颜色
  3. 小白教程:Visual Studio2017配置GitHub图文教程
  4. bai的字怎么写_教师节贺卡祝福语怎么写?教师节贺卡贺词祝福语精简20个字
  5. 各种神经网络优化算法:从梯度下降到Adam方法
  6. RocketMQ实战与原理---安装、部署及简单应用
  7. oracle如何复制dept,[oracle]表复制的sql语句
  8. python wand安装_Python Wand posterize()用法及代码示例
  9. 香帅的北大金融学课笔记11 -- 资产配置
  10. Python 网络爬虫笔记10 -- Scrapy 使用入门