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

相关推荐
evans在进步1 小时前
Spring Boot 核心机制详解:可执行 JAR、CORS、静态资源与配置绑定
spring boot·后端·jar
Sayuanni%31 小时前
SpringBoot 从注解到源码:核心知识点总结
java·spring boot·后端
m0_587383003 小时前
社区家政系统开发实战:从需求分析到上线部署全指南
java·spring boot·spring·需求分析
凤山老林3 小时前
动态 i18n 体系落地:Spring Boot 多租户热加载与前后端协同实践
java·spring boot·后端·i18n
【赫兹威客】浩哥4 小时前
基于SpringBoot+Vue3的健身运动管理系统|WebSocket实时消息 健身房毕设项目
spring boot·websocket·课程设计
凤山老林4 小时前
数据库读写分离与动态路由实战:Spring Boot + ShardingSphere-JDBC 生产配置
数据库·spring boot·后端·分库分表·sharding-jdbc
paopaokaka_luck6 小时前
基于springboot3+vue3的支教志愿者管理系统(AI问答、协同过滤算法、Echarts图形化分析)
spring boot·echarts
2601_963870187 小时前
【计算机毕业设计】基于Vue+Spring Boot的助农电商系统的设计与实现
spring boot·后端·课程设计
野生技术架构师8 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
2602_9599609210 小时前
电商大厂Java面试实录:Spring Boot/JVM/Redis/Kafka/微服务/安全/测试全解析
java·jvm·spring boot·redis·面试题