JPA之JPA中的联合主键

2023-10-28

如果要搭建JPA开发环境,请从JPA第一篇博客看起。


下面以坐飞机为例,讲解联合主键的使用。基本思想是一条航线由两个端点组成。


1、组合主键类

package compositepk;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;

/**
 * 组合主键类: 这里以坐飞机为例,一段航线由起始点和结束点组成 规则一:必须提供无参的构造函数 规则二:必须实现Serializable接口
 * 规则三:必须重写hashCode()和equals()方法
 */
@Embeddable//该注解表示该类用在实体里面,直接使用该类定义的属性
public class AirLinePK implements Serializable {
	private static final long serialVersionUID = 5913768452213218677L;
	private String startCity;
	private String endCity;

	public AirLinePK() {
		super();
	}

	public AirLinePK(String startCity, String endCity) {
		super();
		this.startCity = startCity;
		this.endCity = endCity;
	}

	@Column(length=3)
	public String getStartCity() {
		return startCity;
	}

	public void setStartCity(String startCity) {
		this.startCity = startCity;
	}

	@Column(length=3)
	public String getEndCity() {
		return endCity;
	}

	public void setEndCity(String endCity) {
		this.endCity = endCity;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((endCity == null) ? 
				0 : endCity.hashCode());
		result = prime * result
				+ ((startCity == null) ? 0 : startCity.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;
		AirLinePK other = (AirLinePK) obj;
		if (endCity == null) {
			if (other.endCity != null)
				return false;
		} else if (!endCity.equals(other.endCity))
			return false;
		if (startCity == null) {
			if (other.startCity != null)
				return false;
		} else if (!startCity.equals(other.startCity))
			return false;
		return true;
	}

}


2、航线类

package compositepk;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;

/**
 * 航线类
 */
@Entity
public class AirLine {
	private AirLinePK id;//可嵌入主键
	private String name;

	public AirLine() {
		super();
	}

	public AirLine(AirLinePK id) {
		super();
		this.id = id;
	}
	
	public AirLine(String startCity, String endCity, String name){
		this.id = new AirLinePK(startCity, endCity);
		this.name = name;
	}

	//用于标识组合主键
	@EmbeddedId
	public AirLinePK getId() {
		return id;
	}

	public void setId(AirLinePK id) {
		this.id = id;
	}

	@Column(length=20)
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

3、测试类中的代码

package junit.test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.Test;

import compositepk.AirLine;

/**
 * 测试组合主键
 */
public class CompositTest {

	@Test
	public void save() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("sunft_first");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		em.persist(new AirLine("PEK", "SHA", "北京飞上海"));
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
}


4、数据库中生成的记录如下



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA之JPA中的联合主键 的相关文章

  • 不想保留一对一的实体

    假设我有两节课Employee and Department In Employee我已经写了 OneToOne fetch FetchType EAGER cascade CascadeType ALL JoinColumn name d
  • Hibernate 命名查询使用 Like 和 % % 运算符?

    在我的 Hibernate JPA 示例代码中 public List
  • JPA 乐观锁与同步 Java 方法

    使用 JPA 乐观锁定 我们可以通过 Version 字段控制数据库表是否已被另一个事务同时更新 从而允许在数据库中存储可靠的数据 如果一个Java应用程序只有一个CRUD服务负责数据库中的特定实体 我们也可以同步其方法并管理信息在数据库中
  • 使用 Hibernate Envers 的复合表

    我有一个带有复合表的应用程序 其中包含一个额外的列 一切正常 直到我们添加 Hibernate Envers Audited org hibernate MappingException 无法读取 no pack response Resp
  • 验证错误值无效[重复]

    这个问题在这里已经有答案了 我知道这是一个常见的错误 并且有很多关于它的问题 但我必须创建一个新的问题 这是我的 jsf 页面
  • JPA - 从一列中获取不同的价值

    我有一个只有几个字段的实体 其中之一是城市名称 现在我想从该表中获取所有不同城市的列表 我怎样才能存档它 我尝试使用 DISTINCT 关键字 但它不起作用 我使用 Hibernate 作为 JPA 提供程序 但我想在纯 JPA 查询中获取
  • 为什么 hibernate 在一张表中保存两个 @OneToMany 列表?

    想象一下使用 Hibernate 和 JPA 的简化代码如下 Entity class C Id GeneratedValue public long id MappedSuperclass abstract class A Id Gene
  • JPA Criteria API group_concat 用法

    我目前正在编写一份报告 其中一个字段需要 group concat CriteriaQuery
  • 使用 JPA 时如何在部署时设置序列的架构名称?

    出于安全原因 我们的 Oracle 数据库对象通常属于与登录用户不同的架构 例如 表位于 xx core 中 我们登录的用户是 xx app yy 在我的 persistence xml 中 我定义了一个 orm 文件 以便我可以在部署时指
  • 从 EntityManagerFactory 连接 EntityManager 的问题

    我知道 spring 有它自己的 JPA 对象工厂 但我想让它按原样工作 从那里我将研究最佳实践 我只是处于理解过程中 这是我尝试为其生成 bean 的实际代码 EntityManagerFactory emf Persistence cr
  • JPA @OrderBy() 通过关系表

    我需要一些有关 JPA 框架的帮助 我读过一些关于这个主题的 某种程度上 的答案 但我无法得出任何结论 首先这是我正在使用的设计示例 BusinessObject public class ClassA Column name ID nul
  • 消除 JPA 标准中子查询产生的冗余连接

    我只需要使用 JPA 标准执行以下 MySQL 查询 获取状态列表 来自state table 基于给定的国家名称 在country SELECT state id state name country id FROM state tabl
  • JPA:EntityManager 保存数据花费的时间太长

    我有一个 csv 数据文件 总共有 100 000 条记录 我正在迭代记录并尝试为每条记录更新 5 个表 这是示例数据 EAN Code Site Genric Material Material Sap Ean Code Style Co
  • 使用 JPA 标准的“不在”约束

    我正在尝试写一个NOT IN约束使用JPA Criteria 我尝试过这样的事情 builder not builder in root get property1 虽然我知道这行不通 在上面的语法中 如何添加集合 列表property1会
  • JPA/Hibernate:在不存在的序列/关系上选择 currval

    我对 JPA Hibernate 有一个令人困惑的问题 select currval 将值插入表后 对不存在的关系 序列执行 我有两个类似的案例 一个有效 另一个无效 这是第一个非工作版本 Entity Entity Table name
  • 使用 JPA 从集合中删除子项

    我在我的网络应用程序中使用 JPA 而不是 Hibernate 这是两个实体 仅显示 getter class Child private Parent parent ManyToOne optional false JoinColumn
  • JPQL 计算 OneToMany 关系中多个子匹配的父对象

    在 JavaEE JPA Web 应用程序中 功能实体与患者实体具有双向多对一关系 我想编写一个查询来计算具有一个或多个匹配标准特征的患者数量 我使用 EclipseLink 作为持久性提供程序 例如 我想计算具有 variableName
  • 如何在 Hibernate 中持久化非实体子类中的实体

    我试图将一个实体扩展为一个非实体 用于填充超类的字段 问题是 当我尝试保存它时 Hibernate 会抛出 MappingException 这是因为即使我将 ReportParser 转换为 Report 运行时实例仍然是一个 Repor
  • 如何在@Transactional“READ_UNCOMMITTED”中设置隔离级别。我正在使用 EclipseLink 2.5.1-RC1

    我需要在正在进行的事务中启动新事务 以便第二个事务中的异常将仅回滚新事务而不是旧事务 我通过在第二个事务中设置传播属性来完成此操作 如下所示 Transactional 传播 传播 REQUIRES NEW 这创建了一个新的事务 但是新的事
  • JPA 中的复合主键

    EmbeddedId 或 IdClass 注释用于表示复合主键 我该如何使用不带 EmbeddedId或IdClass 的复合主键 如果可以在没有 EmbeddedId或IdClass 的情况下使用复合主键 那么我该如何使用EntityMa

随机推荐

  • puppet错误记录Could not find value for 'fqdn'

    puppet一次错误记录报一下记录 root puppetagent puppet agent test noop notice Ignoring listen on onetime run err Could not retrieve c
  • markdown中插入 html 视频

    插入腾讯视频 首先在网页下打开腾讯视频 找到自己要添加的视频 点击左下角 分享 复制通用代码链接 粘贴在markdown中 然后插入设置的画面大小就可以了 大小可以自定义的 width 670px height 442px 效果
  • TF-IDF(term frequency–inverse document frequency)

    TF IDF term frequency inverse document frequency 是一种用于资讯检索 与资讯探勘 的常用加权技术 TF IDF是一种统计方法 用以评估一字词对于一个文件集或一个语料库 中的其中一份文件 的重要
  • DHCP理论讲解(动态主机配置协议)

    作者 小刘在这里 每天分享云计算网络运维课堂笔记 努力不一定有收获 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的 绽放 愿所有的美好 再疫情结束后如约而至 目录 一 DHCP 服务 动态主机配置协议
  • FreeRTOS + UDP通讯实验

    UDP协议简介 UDP是User Datagram Protocol的简称 中文名是用户数据报协议 是一种无连接 不可靠的协议 它只是简单地实现从一端主机到另一端主机的数据传输功能 这些数据通过IP层发送 在网络中传输 到达目标主机的顺序是
  • 计算机网络 构造超网的步骤,计算机网络之构造超网(无分类编址)

    构造超网 也称为路由聚合 为什么要进行路由聚合 因为如果不聚合的话 路由转发表将会很大 例如下图 将会在路由转发表上增加5条记录 而聚合后就只增加一个了 如何进行路由聚合呢 找出共同前缀 例如 为什么要构造超网 我们知道 在地址分类的方法里
  • mysql 多表 结构相同 查询

    MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中 多个 SELECT 语句会删除重复的数据 expression1 expression2 expression n 要检索的列 tables 要
  • TCP报文头详解

    TCP报文是TCP层传输的数据单元 也叫报文段 1 端口号 用来标识同一台计算机的不同的应用进程 16位源端口 Source Port 16位的源端口字段包含初始化通信的端口号 源端口和IP地址的作用是标识报文的返回地址 16位目的端口 D
  • 电信5g网络apn接入点_为什么5G网络出来后,我的4G网速越来越慢了

    网速变慢了该怎么办 换5G手机 对于土豪来讲早就上手5G手机了 可是对于平民百姓 却还在犹豫不决 毕竟5G手机的价格就目前来看算不上非常亲民 所以相信很多人都和所长一样在等待5G手机下探到千元机里 当然 之所以暂时不换5G手机除了价格的原因
  • php 反序列化总结

    果然不记笔记过一段时间就有一些东西忘了 这里给大家一个参考 如果有什么不对 希望各位师傅可以提出来 目录 基本 序列化 serialize函数 json encode函数 反序列化 unserialize函数 json decode函数 魔
  • vue3 页面导出为pdf

    下载插件 jspdf 2 5 1 html2canvas 1 3 3 import as html2canvas from html2canvas import as jspdf from jspdf function downloadpd
  • Moonbeam生态跨链互操作项目汇总

    立秋已过 今年的夏天已经接近尾声 即将迎来凉爽的秋天 Moonbeam生态一同以往持续成长 在8月也举办了不少活动 完成集成合作以及协议更新 让我们一同快速了解Moonbeam生态项目近期发生的大小事件吧 Moonwell Moonwell
  • 穷举篇(三)之经典穷举案例

    四 针对有验证码后台穷举 网站后台或者有登录的地方都可能存在验证码验证 验证码的作用 不少网站为了防止用户利用机器人自动注册 登录 灌水 都会采用验证 码技术 所谓的验证码 就是将一串随机产生的数字和符号 生成一幅图片 在图像上加上干扰像素
  • pip的基本命令和使用

    作者介绍 作者 小刘在C站 每天分享课堂笔记 一起努力 共赴美好人生 夕阳下 是最美的绽放 目录 一 pip介绍 二 pypi仓库 三 pip安装与使用 1 pip命令在哪里输入 2 pip的使用 3 pip的安装库的基本命令 4 pip库
  • [gulimall]订单及库存

    1 提交订单 查询商品信息 查询收货地址 查询库存信息 计算价格 2 下订单 1 验证令牌防止重复提交 获取当前用户登录的信息 通过lua脚本验证令牌和删除令牌 2 验证价格 从数据库查询最新的商品价格 和订单的金额对比 如果不一致则返回错
  • iOS Epub阅读器改造记录

    六个月前在这个YHEpubDemo阅读器的基础上做了一些优化 这里做一下记录 1 首行缩进修复 由于分页的存在 新的一页的首行可能是新的一行 则应该缩进 也可能是前面一页段落的延续 这时候不应该缩进 YHEpubDemo基于XDSReade
  • 基于java的https双向认证,android上亦可用

    https my oschina net jjface blog 339144 摘要 概述 客户端 浏览器或者使用http协议和服务器通信的程序 如 客户端通过浏览器访问某一网站时 如果该网站为HTTPS网站 浏览器会自动检测系统中是否存在
  • 跟着React官网学习(一):小游戏

    目标简述 简单了解React Props传值 组件之间的交互 开发者工具 使用vscode开发 搭建环境创建项目 1 安装node js和npm 2 使用create react app创建项目并运行 1 在dos命令窗口 指定文件目录 输
  • 【UI自动化】selenium中三种等待方式

    Selenium 等待方式 Selenium 等待方式 示例 time sleep seconds 固定等待 智能隐性的等待implicitly wait 回应超时等待 智能显性等待WebDriverWait expected condit
  • JPA之JPA中的联合主键

    如果要搭建JPA开发环境 请从JPA第一篇博客看起 下面以坐飞机为例 讲解联合主键的使用 基本思想是一条航线由两个端点组成 1 组合主键类 package compositepk import java io Serializable im