JPA中基本类型集合的映射与操作实例

news2025/2/3 18:27:40

在Java Persistence API(JPA)中,我们经常会遇到需要将基本类型集合(如List或Set)持久化到数据库中的场景。JPA通过@ElementCollection注解为我们提供了一种简单而强大的方式来实现这一功能。本文将详细介绍如何使用@ElementCollection注解来映射基本类型集合,并通过实例演示如何持久化和加载这些数据。

  1. 基本类型集合的映射
    在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表的主键。

  2. 自定义集合表的映射
    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。

  3. 持久化和加载数据
    接下来,我们通过一个简单的示例来演示如何使用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对象及其电话号码列表,并将它们打印出来。

  4. 数据库表结构和数据
    在执行上述代码后,数据库中会生成以下表结构:
    Customer表:
    id(主键)
    name
    CustomerPhoneNumbers表(假设我们使用了自定义的集合表名称):
    customerId(外键,指向Customer表的id)
    phoneNumbers
    以下是插入数据后的表数据:
    Customer表:
    idname1Lindsey Craft2Morgan Philips
    CustomerPhoneNumbers表:
    customerIdphoneNumbers1111-111-11111222-222-22222333-333-3333

  5. 总结
    本文通过一个简单的示例,详细介绍了如何在JPA中使用@ElementCollection注解来映射基本类型集合,并通过EntityManager进行数据的持久化和加载。@ElementCollection为我们提供了一种方便的方式来处理基本类型集合的持久化,而@CollectionTable注解则允许我们对集合表的映射进行自定义。通过这种方式,我们可以轻松地将包含基本类型集合的实体持久化到数据库中,并在需要时加载它们。
    希望本文对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2291388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

沙皮狗为什么禁养?

各位铲屎官们,今天咱们来聊聊一个比较敏感的话题:沙皮狗为什么会被禁养?很多人对沙皮狗情有独钟,但有些地方却明确禁止饲养这种犬种,这背后到底是什么原因呢?别急,今天就来给大家好好揭秘&#…

Dest1ny漏洞库:用友 U8 Cloud ReleaseRepMngAction SQL 注入漏洞(CNVD-2024-33023)

大家好,今天是Dest1ny漏洞库的专题!! 会时不时发送新的漏洞资讯!! 大家多多关注,多多点赞!!! 0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚…

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. 直接从活动电子…

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的构建,这些渲染控制语句包括控制组件是否显示的条件渲染语句,基于数组数据快…

UbuntuWindows双系统安装

做系统盘: Ubuntu20.04双系统安装详解(内容详细,一文通关!)_ubuntu 20.04-CSDN博客 ubuntu系统调整大小: 调整指南: 虚拟机中的Ubuntu扩容及重新分区方法_ubuntu重新分配磁盘空间-CSDN博客 …

【leetcode详解】T598 区间加法

598. 区间加法 II - 力扣(LeetCode) 思路分析 核心在于将问题转化, 题目不是要求最大整数本身,而是要求解最大整数的个数 结合矩阵元素的增加原理,我们将抽象问题转为可操作的方法,其实就是再找每组ops中…

备考蓝桥杯嵌入式2:使用LCD完成显示

LCD LCD(液晶显示器,Liquid Crystal Display)是一种常见的平面显示技术,广泛应用于电视、电脑显示器、手机屏幕等设备。蓝桥杯中,也有涉及到使用LCD来完成字符串显示的要求和操作。 考场上会给予LCD的驱动包&#xf…

网络爬虫学习:应用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…

Zabbix 推送告警 消息模板 美化(钉钉Webhook机器人、邮件)

目前网络上已经有很多关于Zabbix如何推送告警信息到钉钉机器人、到邮件等文章。 但是在搜索下来,发现缺少了对告警信息的美化的文章。 本文不赘述如何对Zabbix对接钉钉、对接邮件,仅介绍我采用的美化消息模板的内容。 活用AI工具可以减轻很多学习、脑力负…

罗格斯大学:通过输入嵌入对齐选择agent

📖标题:AgentRec: Agent Recommendation Using Sentence Embeddings Aligned to Human Feedback 🌐来源:arXiv, 2501.13333 🌟摘要 🔸多代理系统必须决定哪个代理最适合给定的任务。我们提出了一种新的架…

机器学习7-全连接神经网络3-过拟合与超参数

机器学习6-全连接神经网络3-过拟合欠拟合 过拟合应对过拟合-最优方案:获取更多的训练数据应对过拟合-次优方案:正则化应对过拟合-次优方案2:随机失活综合考量 超参数超参数优化方法 过拟合 机器学习的根本问题是优化和泛化的问题。优化——是…