@Embeddable and @ElementCollection 嵌套导致SpringBoot程序无法启动的问题

news/2025/2/22 15:50:33/

        遇到了@Embeddable and @ElementCollection 嵌套导致SpringBoot程序无法启动的问题。现象和StackOverflow上的这个问题一模一样:java - Embeddable and ElementCollection nesting - Stack Overflow。理解了下报错原因,特在此写篇文章记录一下。

        具体报错信息如下:org.hibernate.AnnotationException: @OneToMany, @ManyToMany or @ElementCollection cannot be used inside an @Embeddable that is also contained within an @ElementCollection: com.***.collection&&element.myValues

代码示例如下:

@Entity
public class Tournament {@IdLong id;@ElementCollection@CollectionTableprivate List<Edition>;
}@Embeddable
public class Edition {@ElementCollection@CollectionTableprivate List<Round>
}@Embeddable
public class Round {blabla;
}

@Embeddable 注解的作用:

        @Embeddable是JPA中的一个注解,表示当前类是嵌套类,嵌套类的意思就是该类可以作为另一个实体类的组成部分进行嵌入,JPA框架会将嵌入类的属性映射到同一张数据库表中的字段上。嵌入式类应该被视为一个值对象,而不是一个独立的实体。

        当你不想额外创建表(实体),但是又需要定义一些小对象以便使类看起来或者表示起来更加容易理解的时候,使用 @Embeddable 注解是个很不错的选择。

@ElementCollection 注解的作用:

        @ElementCollection注解是Hibernate框架中的一个注解,用于表示实体类中的一个集合属性,表示的是实体类中一对多或多对多的关系。它的作用是将集合中的元素映射为一个独立的表,与实体类的主表进行关联


 

为什么会报错:

        上面说到了 @ElementCollection 会创建独立的表与实体类的主表进行关联,注意是它表示的是实体类中一对多或者多对多的关系。而 @Embeddable 注解的类是值对象,不是实体,它不存在独立的表。

        所以在在 @Embeddable嵌入式类 中使用 @ElementCollection 注解会引起映射的冲突,因为它会尝试在嵌入式类对应的表中创建一个与集合相关的表,但实际上嵌入式类并不会有自己的表。

        有两个修正办法,第一个是将 @Embeddable嵌入式类 改为实体。但是个人嫌太麻烦了,而且不想搞一张新表,所以个人使用的是另外一种偷懒的办法,将@ElementCollection修饰的属性由 List<> 改为了 JsonString,规避掉了这个问题

参考:

        java - Embeddable and ElementCollection nesting - Stack Overflow

        JPA 内嵌对象

        Hibernate框架学习之注解映射实体类-腾讯云开发者社区-腾讯云


http://www.ppmy.cn/news/1182726.html

相关文章

缺少d3dx9_43.dll怎么解决 win系统如何运行dll文件?

大家好&#xff01;今天我来给大家分享一下关于d3dx9_43.dll缺失的4种详细解决方案。 首先&#xff0c;让我们了解一下d3dx9_43.dll是什么文件。其实&#xff0c;d3dx9_43.dll是DirectX的一个组件&#xff0c;它主要负责处理游戏中的一些特效和动画效果。如果这个文件丢失了&a…

【VUE】ArcoDesign之自定义主题样式和命名空间

前言 Arco Design是什么&#xff1f; Arco Design 是由字节跳动推出的企业级产品的完整设计和开发解决方案前端组件库 官网地址&#xff1a;https://arco.design/同时也提供了一套开箱即用的中后台前端解决方案&#xff1a;Arco Design Pro(https://pro.arco.design/) Arco De…

GoLong的学习之路(十二)语法之标准库 flag的使用

上回书说到&#xff0c;fmt的标准库的一些常用的使用函数。这次说flag的使用&#xff0c;以下这些库要去做了解。不然GG&#xff0c;Go语言内置的flag包实现了命令行参数的解析&#xff0c;flag包使得开发命令行工具更为简单。 文章目录 os.Argsflag包flag.Type()flag.TypeVar(…

第二次课10.28

hash 计算接口 Crypto API &#xff08;证书&#xff0c;对称加密&#xff0c;非对称加密&#xff0c;编码和解码&#xff09; CryptAcquireContext CryptCreateHash CryptReleaseContext CryptHashData CryptDestroyHash CryptGetHashParam 注册表操作接口 RegEnumKeyEx RegE…

scala集合的partition方法使用

在Scala中&#xff0c;partition 方法用于将集合&#xff08;例如 List、Array &#xff0c;Set等&#xff09;中的元素根据给定的条件分成两个部分&#xff0c;并返回一个元组&#xff0c;其中包含两个新的集合&#xff0c;第一个包含满足条件的元素&#xff0c;另一个包含不满…

Rust 模块系统

文章目录 模块系统crate包cargo 创建库库的使用 模块系统 Rust的{模块系统|the module system}&#xff0c;包括&#xff1a; * 包&#xff08;Packages&#xff09;&#xff1a; Cargo 的一个功能&#xff0c;它允许你构建、测试和分享 crate。 * Crates &#xff1a;一个模…

Python基础汇总、

python的优点 易于学习&#xff1a;Python有相对较少的关键字&#xff0c;结构简单&#xff0c;和一个明确定义的语法&#xff0c;学习起来更加简单。易于阅读&#xff1a;Python代码定义的更清晰。易于维护&#xff1a;Python的成功在于它的源代码是相当容易维护的。一个广泛的…

c++复合数据类型

文章目录 复合数据类型数组 复合数据类型 数组 数据类型 数组名[元素个数] #include<iostream>using namespace std;int main() {const int n 3;// 元素个数必须为常量double ls[n];//初始化int ls1[2] {1, 2};float ls2[] {1.2, 3.1, 5.2, 6.6};short ls3[5] {3,…