JPA中基本类型集合的映射与操作实例
在Java Persistence API(JPA)中,我们经常会遇到需要将基本类型集合(如List或Set)持久化到数据库中的场景。JPA通过@ElementCollection注解为我们提供了一种简单而强大的方式来实现这一功能。本文将详细介绍如何使用@ElementCollection注解来映射基本类型集合,并通过实例演示如何持久化和加载这些数据。
-
基本类型集合的映射
在JPA中,要将一个基本类型集合持久化到数据库中,我们需要在实体类中使用@ElementCollection注解。这个注解会告诉JPA,被注解的字段是一个集合,并且集合中的元素是基本类型,而不是另一个实体。JPA会为这个集合创建一个单独的表,并通过外键与主实体表关联。
例如,我们有一个Customer实体类,其中包含一个List类型的phoneNumbers字段,表示客户的电话号码列表。我们可以这样定义这个实体类:
java复制
@Entity
public class Customer {
@Id
@GeneratedValue
private int id;
private String name;@ElementCollection
private List phoneNumbers;// 省略构造方法、getter和setter方法
}
在上述代码中,@ElementCollection注解被放置在phoneNumbers字段上。JPA会为Customer实体创建一个主表(Customer表),同时为phoneNumbers集合创建一个单独的表(默认命名为Customer_PhoneNumbers)。Customer_PhoneNumbers表中会包含一个外键字段(customer_id),指向Customer表的主键。 -
自定义集合表的映射
JPA默认会根据一定的命名规则来生成集合表的名称和字段。然而,我们可以通过@CollectionTable注解来自定义集合表的名称、外键名称等信息。例如,我们可以这样定义Customer类,自定义集合表的名称为CustomerPhoneNumbers:
java复制
@Entity
public class Customer {
@Id
@GeneratedValue
private int id;
private String name;@ElementCollection
@CollectionTable(name = “CustomerPhoneNumbers”, joinColumns = @JoinColumn(name = “customerId”))
private List phoneNumbers;// 省略构造方法、getter和setter方法
}
在上述代码中,@CollectionTable注解的name属性指定了集合表的名称为CustomerPhoneNumbers,joinColumns属性中的@JoinColumn注解指定了外键字段的名称为customerId。 -
持久化和加载数据
接下来,我们通过一个简单的示例来演示如何使用EntityManager来持久化和加载包含基本类型集合的实体。
3.1 持久化数据
我们可以通过EntityManager的persist方法来将Customer实体及其phoneNumbers集合持久化到数据库中。以下是一个示例代码:
java复制
public class ExampleMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory(“example-unit”);
try {
persistEntity(emf);
} finally {
emf.close();
}
}private static void persistEntity(EntityManagerFactory emf) {
EntityManager em = emf.createEntityManager();
Customer c1 = new Customer();
c1.setName(“Lindsey Craft”);
c1.setPhoneNumbers(Arrays.asList(“111-111-1111”, “222-222-2222”));
Customer c2 = new Customer();
c2.setName(“Morgan Philips”);
c2.setPhoneNumbers(Arrays.asList(“333-333-3333”));
em.getTransaction().begin();
em.persist(c1);
em.persist(c2);
em.getTransaction().commit();
em.close();
}
}
在上述代码中,我们创建了两个Customer对象,并为它们分别设置了电话号码列表。然后,我们通过EntityManager的persist方法将这些对象持久化到数据库中。
3.2 加载数据
我们可以通过EntityManager的查询方法来加载包含基本类型集合的实体。以下是一个示例代码:
java复制
public class ExampleMain2 {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory(“example-unit”);
try {
loadEntity(emf);
} finally {
emf.close();
}
}private static void loadEntity(EntityManagerFactory emf) {
EntityManager em = emf.createEntityManager();
List customers = em.createQuery(“SELECT c FROM Customer c”, Customer.class).getResultList();
for (Customer customer : customers) {
System.out.println(customer.getName() + ": " + customer.getPhoneNumbers());
}
em.close();
}
}
在上述代码中,我们通过EntityManager的createQuery方法执行了一个JPQL查询,加载了所有Customer对象及其电话号码列表,并将它们打印出来。 -
数据库表结构和数据
在执行上述代码后,数据库中会生成以下表结构:
Customer表:
id(主键)
name
CustomerPhoneNumbers表(假设我们使用了自定义的集合表名称):
customerId(外键,指向Customer表的id)
phoneNumbers
以下是插入数据后的表数据:
Customer表:
idname1Lindsey Craft2Morgan Philips
CustomerPhoneNumbers表:
customerIdphoneNumbers1111-111-11111222-222-22222333-333-3333 -
总结
本文通过一个简单的示例,详细介绍了如何在JPA中使用@ElementCollection注解来映射基本类型集合,并通过EntityManager进行数据的持久化和加载。@ElementCollection为我们提供了一种方便的方式来处理基本类型集合的持久化,而@CollectionTable注解则允许我们对集合表的映射进行自定义。通过这种方式,我们可以轻松地将包含基本类型集合的实体持久化到数据库中,并在需要时加载它们。
希望本文对你有所帮助!
相关文章:
JPA中基本类型集合的映射与操作实例
在Java Persistence API(JPA)中,我们经常会遇到需要将基本类型集合(如List或Set)持久化到数据库中的场景。JPA通过ElementCollection注解为我们提供了一种简单而强大的方式来实现这一功能。本文将详细介绍如何使用Elem…...
[MySQL]事务的理论、属性与常见操作
目录 一、事物的理论 1.什么是事务 2.事务的属性(ACID) 3.再谈事务的本质 4.为什么要有事务 二、事务的操作 1.事务的支持版本 2.事务的提交模式 介绍 自动提交模式 手动提交模式 3.事务的操作 4.事务的操作演示 验证事务的回滚 事务异常…...
沙皮狗为什么禁养?
各位铲屎官们,今天咱们来聊聊一个比较敏感的话题:沙皮狗为什么会被禁养?很多人对沙皮狗情有独钟,但有些地方却明确禁止饲养这种犬种,这背后到底是什么原因呢?别急,今天就来给大家好好揭秘&#…...
Dest1ny漏洞库:用友 U8 Cloud ReleaseRepMngAction SQL 注入漏洞(CNVD-2024-33023)
大家好,今天是Dest1ny漏洞库的专题!! 会时不时发送新的漏洞资讯!! 大家多多关注,多多点赞!!! 0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚…...
PHP Error处理与优化指南
PHP Error处理与优化指南 引言 在PHP编程中,错误处理是保证程序稳定性和用户体验的关键环节。良好的错误处理机制不仅能帮助开发者快速定位问题,还能提升应用程序的健壮性。本文将详细介绍PHP错误处理的方法、技巧以及优化策略。 一、PHP错误处理概述 1.1 错误类型 PHP中…...
MySQL知识点总结(十八)
说明你对InnoDB集群的整体认知。 MySQL组复制技术是InnoDB集群实现的基础,组复制安装在集群中的每个服务器实例上。组复制能够创建弹性复制拓扑,在集群中的服务器脱机时可以自动重新配置自己。必须至少有三台服务器才能组成一个可以提供高可用性的组。组…...
DeepSeek-R1模型1.5b、7b、8b、14b、32b、70b和671b有啥区别?
deepseek-r1的1.5b、7b、8b、14b、32b、70b和671b有啥区别?码笔记mabiji.com分享:1.5B、7B、8B、14B、32B、70B是蒸馏后的小模型,671B是基础大模型,它们的区别主要体现在参数规模、模型容量、性能表现、准确性、训练成本、推理成本…...
#define,源文件与头文件,赋值表达式
1.#define 1.1定义 #define 是一个预处理指令,用于定义宏 宏,是预处理阶段(在编译之前)由预处理器处理的代码片段 1.2使用 1.2.1 #define 可以定义常量 #define PI 3.14159 1.2.2 #define 可以定义宏函数 #define SQUARE(x) ((…...
踏入编程世界的第一个博客
我,一个双非一本大一新生,普通的不能再普通了,面对宏伟庞大的计算机世界仍显得举手无措,我自以为自身仍有些许骨气,不想普普通通,甚是浑浑噩噩的度过四年大学,经历了高考的打击,双非…...
5分钟在本地PC上使用VLLM快速启动DeepSeek-R1-Distill-Qwen-32B
5分钟在本地PC上使用VLLM快速启动DeepSeek-R1-Distill-Qwen-32B 前言环境准备所需工具创建虚拟环境安装VLLM及依赖库 模型下载安装Hugging Face CLI下载DeepSeek-R1-Distill-Qwen-32B 模型启动启动命令启动确认 模型验证发送API请求示例输出 注意事项参考链接 前言 VLLM 是一个…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.13 降维打击:扁平化操作的六种武器
1.13 降维打击:扁平化操作的六种武器 目录 #mermaid-svg-bbLxDryjxBbXe3tu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bbLxDryjxBbXe3tu .error-icon{fill:#552222;}#mermaid-svg-bbLxDryjxBbXe3tu…...
Oracle Primavera P6 最新版 v24.12 更新 2/2
目录 一. 引言 二. P6 EPPM 更新内容 1. 用户管理改进 2. 更轻松地标准化用户设置 3. 摘要栏标签汇总数据字段 4. 将里程碑和剩余最早开始日期拖到甘特图上 5. 轻松访问审计数据 6. 粘贴数据时排除安全代码 7. 改进了状态更新卡片视图中的筛选功能 8. 直接从活动电子…...
DeepSeek相关技术整理
相关介绍 2024年12月26日,DeepSeek V3模型发布(用更低的训练成本,训练出更好的效果)671B参数,激活37B。2025年1月20日,DeepSeek-R1模型发布(仅需少量标注数据(高质量长cotÿ…...
AI-on-the-edge-device - 将“旧”设备接入智能世界
人工智能无处不在,从语音到图像识别。虽然大多数 AI 系统都依赖于强大的处理器或云计算,但**边缘计算**通过利用现代处理器的功能,使 AI 更接近最终用户。 本项目演示了使用 **ESP32**(一种低成本、支持 AI 的设备)进行…...
Openfga 授权模型搭建
1.根据项目去启动 配置一个 openfga 服务器 先创建一个 config.yaml文件 cd /opt/openFGA/conf touch ./config.yaml 怎么配置? 根据官网来看 openfga/.config-schema.json at main openfga/openfga GitHub 这里讲述详细的每一个配置每一个类型 这些配置有…...
C++模板编程——可变参函数模板之折叠表达式
目录 1. 什么是折叠表达式 2. 一元左折 3. 一元右折 4. 二元左折 5. 二元右折 6. 后记 上一节主要讲解了可变参函数模板和参数包展开,这一节主要讲一下折叠表达式。 1. 什么是折叠表达式 折叠表达式是C17中引入的概念,引入折叠表达式的目的是为了…...
ArkTS渲染控制
文章目录 if/else:条件渲染ArkUI通过自定义组件的build()函数和@Builder装饰器中的声明式UI描述语句构建相应的UI。在声明式描述语句中开发者除了使用系统组件外,还可以使用渲染控制语句来辅助UI的构建,这些渲染控制语句包括控制组件是否显示的条件渲染语句,基于数组数据快…...
在Scene里面绘制编辑工具
功能要求 策划要在scene模式下编辑棋子摆放。用handle.GUI绘制来解决了。 问题 在scene模式下编辑产生的数据,进入游戏模式后就全不见了。改为executeAlways也没用。我的解决办法是把编辑数据序列化保存到本地。在OnEnable的时候再读取。但是我忽然想到ÿ…...
UbuntuWindows双系统安装
做系统盘: Ubuntu20.04双系统安装详解(内容详细,一文通关!)_ubuntu 20.04-CSDN博客 ubuntu系统调整大小: 调整指南: 虚拟机中的Ubuntu扩容及重新分区方法_ubuntu重新分配磁盘空间-CSDN博客 …...
[Linux]如何將腳本(shell script)轉換到系統管理服務器(systemd service)來運行?
[InfluxDB]Monitor Tem. and Volt of RaspberryPi and Send Message by Line Notify 在Linux中,shell腳本(shell script)常用於運行各種自動化的流程,包含API串接,設置和啟動應用服務等等,腳本語法也相對易學易讀,因此…...
【leetcode详解】T598 区间加法
598. 区间加法 II - 力扣(LeetCode) 思路分析 核心在于将问题转化, 题目不是要求最大整数本身,而是要求解最大整数的个数 结合矩阵元素的增加原理,我们将抽象问题转为可操作的方法,其实就是再找每组ops中…...
分层多维度应急管理系统的设计
一、系统总体架构设计 1. 六层体系架构 #mermaid-svg-QOXtM1MnbrwUopPb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QOXtM1MnbrwUopPb .error-icon{fill:#552222;}#mermaid-svg-QOXtM1MnbrwUopPb .error-text{f…...
稀疏进化训练:机器学习优化算法中的高效解决方案
稀疏进化训练:机器学习优化算法中的高效解决方案 稀疏进化训练:机器学习优化算法中的高效解决方案引言第一部分:背景与动机1.1 传统优化算法的局限性1.2 进化策略的优势1.3 稀疏性的重要性 第二部分:稀疏进化训练的核心思想2.1 稀…...
实战:如何利用网站日志诊断并解决收录问题?
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/50.html 利用网站日志诊断并解决收录问题是一种非常有效的方法。以下是一个实战指南,帮助你如何利用网站日志来诊断并解决网站的收录问题: 一、获取并分析网站日志 …...
群晖搭建Gitea教程(使用系统自带的postgresql)
基于群晖7.2.2,使用套件中心的gitea,和系统自带的postgresql postgresql: 切换到postgres用户 sudo -I -u postgres 在想要保存数据库的磁盘路径下创建PostgreSql文件夹 初始化数据库文件夹配置 initdb -D ./PostgreSql 备份./PostgreSql路径下的post…...
备考蓝桥杯嵌入式2:使用LCD完成显示
LCD LCD(液晶显示器,Liquid Crystal Display)是一种常见的平面显示技术,广泛应用于电视、电脑显示器、手机屏幕等设备。蓝桥杯中,也有涉及到使用LCD来完成字符串显示的要求和操作。 考场上会给予LCD的驱动包…...
网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开。
一、前言 我从24年11月份开始学习网络爬虫应用开发,经过2个来月的努力,于1月下旬完成了开发一款网络爬虫软件的学习目标。这里对本次学习及应用开发进行一下回顾总结。 前几天我已经发了一篇日志(网络爬虫学习:应用selenium从搜…...
Elasticsearch的索引生命周期管理
目录 说明零、参考一、ILM的基本概念二、ILM的实践步骤Elasticsearch ILM策略中的“最小年龄”是如何计算的?如何监控和调整Elasticsearch ILM策略的性能? 1. **监控性能**使用/_cat/thread_pool API基本请求格式请求特定线程池的信息响应内容 2. **调整…...
Observability:实现 OpenTelemetry 原生可观察性的商业价值
作者:来自 Elastic David Hope 利用开放标准和简化的数据收集转变组织的可观察性策略。 现代组织面临着前所未有的可观察性挑战。随着系统变得越来越复杂和分散,传统的监控方法难以跟上步伐。由于数据量每两年翻一番,系统跨越多个云和技术&am…...
C语言中的线程本地变量
这处线程本地变量可不是简单的函数中的本地变量。线程除了可以共享存在于进程内的全局变量外,还可以有属于自己的线程本地变量。线程本地变量的值只能够在某个具体线程的生存期内可用。变量的实际存储空间会在线程开始时分配,线程结束时回收。线程不会对…...
