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

相关推荐
昵称为空C2 小时前
SpringBoot3 http接口调用新方式RestClient + @HttpExchange像使用Feign一样调用
spring boot·后端
麦兜*11 小时前
MongoDB Atlas 云数据库实战:从零搭建全球多节点集群
java·数据库·spring boot·mongodb·spring·spring cloud
麦兜*11 小时前
MongoDB 在物联网(IoT)中的应用:海量时序数据处理方案
java·数据库·spring boot·物联网·mongodb·spring
汤姆yu11 小时前
基于springboot的毕业旅游一站式定制系统
spring boot·后端·旅游
计算机毕业设计木哥12 小时前
计算机毕设选题推荐:基于Java+SpringBoot物品租赁管理系统【源码+文档+调试】
java·vue.js·spring boot·mysql·spark·毕业设计·课程设计
hdsoft_huge1 天前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
AD钙奶-lalala1 天前
SpringBoot实现WebSocket服务端
spring boot·后端·websocket
毕设源码-朱学姐1 天前
【开题答辩全过程】以 4S店汽车维修保养管理系统为例,包含答辩的问题和答案
java·spring boot·汽车
BXCQ_xuan1 天前
软件工程实践二:Spring Boot 知识回顾
java·spring boot·后端
wuxuanok1 天前
SpringBoot -原理篇
java·spring boot·spring