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

遇到了@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 {
    @Id
    Long id;

    @ElementCollection
    @CollectionTable
    private List<Edition>;
}

@Embeddable
public class Edition {

    @ElementCollection
    @CollectionTable
    private 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框架学习之注解映射实体类-腾讯云开发者社区-腾讯云

相关推荐
jktantan44 分钟前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
露天赏雪15 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
蜗牛8751 天前
为 Spring Boot 团队做一个 Elasticsearch 查询工作台:六种模式、语义补全与浏览器直连
spring boot
养军博客1 天前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
txxzjmzlh1 天前
SpringBoot 统⼀功能处理
java·spring boot·后端
秋天的怀念_David2 天前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
余槐i2 天前
MySQL 8.0 联合索引走错:为什么加了索引查询反而从 200ms 变成 8s
java·spring boot·mysql·docker·性能优化
nice_lcj5202 天前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发
AI源码3 天前
旅游推荐管理系统
spring boot
aiks_yuan3 天前
Spring Boot SSE 流式输出变成一次性返回怎么办:大模型打字机效果失效的 5 个原因(Spring Boot 4.1.2 实测)
spring boot