复合主键@IdClass
有时一个实体的主键可能同时为多个,例如同样是之前使用的“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相关推荐
- Hibernate JPA-实体类定义联合主键@IdClass、@EmbeddedId注解
文章目录 一.复合主键@idClass.@Embeddable @idClass @Embeddable 网上实例demo 二.参考 一.复合主键@idClass.@Embeddable 可参照官方文 ...
- springboot jpa 复合主键 联合主键
为什么80%的码农都做不了架构师?>>> 在开发中,数据库中定义了一个复合主键,这时候在映射不稍微处理下会有一点问题.什么does not define an IdClass错 ...
- JPA复合主键的使用
背景 人员信息和组信息的关联表中使用的USER_ID_和GROUP_ID_的联合主键,在维护组人员信息的时候,发现JPA打印的SQL只根据USER_ID_作为条件来更新数据,当B组存在zhangsan ...
- java 复合主键,Spring Data Jpa 复合主键的实现
前言 这次大创有个需求,在数据库建表时发现,user表与project表的关系表 user_project的主键为复合主键: CREATE TABLE user_project( user_id IN ...
- java复合主键注解_hibernate注解方式实现复合主键
有时一个实体的主键可能同时为多个,例如同样是之前使用的"CustomerEO"实体,需要通过name和email来查找指定实体,当且仅当name和email的值完全相同时,才认为是 ...
- mapper中mysql复合语句_MyBatis定义复合主键
前为别名后为主查询getXXX语句中字段 SELECT colid,colname FROM table1 SELECT * FROM table2 WHERE id = #{id} AND name ...
- SpringData JPA复合主键
一.JPA和复合主键的简介 JPA全称Java Persistence API,是一组用于将数据存入数据库的类和方法的集合.JPA通过JDK5.0注解或XML描述对象-关系表的映射关系, ...
- JPA之使用复合主键
文章目录 1. 目标 2. 数据库设计 3. Entity 定义 4. 使用 5. 源码 1. 目标 在设计数据库表的时候,有时候不想定义没有意义的Id作为主键,就可以使用复合主键.这个时候使用JPA ...
- Oracle-No.04 Oracle视图加主键解决hibernate复合主键问题
2019独角兽企业重金招聘Python工程师标准>>> Oracle视图默认是没有主键的,因此在用hibernate反向生成java类时,会自动采用复合主键,多生成一个类名+ID的类 ...
最新文章
- 从一张风景照中就学会的SinGAN模型,究竟是什么神操作?| ICCV 2019最佳论文
- 网站SEO优化、IIS日志分析工具 IISLogViewer V2.0 发布
- [公告] TechNet / MSDN 经理人博客上周移机整合暂断
- Ubuntu16.04(64位)下面使用Doxygen+Graphviz分析python代码
- java解析表字段_从SQL / HQL Java解析表和列名
- 需要额外端口信息_NR逻辑天线端口介绍
- java exec 关闭,Java学习之使用Runtime.exec()启动、关闭Tomcat
- 众包专访:告别接包黑历史,来到开源中国众包接包小记
- RegSetValueEx 计算WCHAR字符长度 wcslen
- Java集合相关面试题总结
- Cgroup 资源配置方法----------Control Groups------Docker通过 Cgroup 来控制容器使用的资源配额
- jquery Ajax回调函数
- 西游记中托塔李天王的三个儿子,一个女儿和一个干女儿
- 树莓派-10-安装jupyter并控制SG90舵机
- APK安装包如何安装到安卓手机上
- openvino只支持英特尔6代以上的cpu
- 蛋蛋弹车3-具有功能安全EPS系统设计(电机控制算法-PID)
- matlab存储excel数据,怎么把matlab表格数据写入excel-怎么把matlab中处理的数据存入到excel中...
- xcode打包优化级别设置
- SGM4808YTQA16G/TR
热门文章
- 安装 | VMware Workstation Pro 16 for Unbuntu 20.10 虚拟机安装教程
- 模糊搜索时搜索结果中关键词变为不同颜色
- 小白教程:Visual Studio2017配置GitHub图文教程
- bai的字怎么写_教师节贺卡祝福语怎么写?教师节贺卡贺词祝福语精简20个字
- 各种神经网络优化算法:从梯度下降到Adam方法
- RocketMQ实战与原理---安装、部署及简单应用
- oracle如何复制dept,[oracle]表复制的sql语句
- python wand安装_Python Wand posterize()用法及代码示例
- 香帅的北大金融学课笔记11 -- 资产配置
- Python 网络爬虫笔记10 -- Scrapy 使用入门