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

相关推荐
韩立学长21 小时前
【开题答辩实录分享】以《基于SpringBoot在线小说阅读平台》为例进行答辩实录分享
java·spring boot·后端
程序猿小蒜1 天前
基于SpringBoot的企业资产管理系统开发与设计
java·前端·spring boot·后端·spring
计算机学姐1 天前
基于SpringBoot的健身房管理系统【智能推荐算法+可视化统计】
java·vue.js·spring boot·后端·mysql·spring·推荐算法
Q_Q5110082851 天前
python+uniapp基于微信小程序的垃圾分类信息系统
spring boot·python·微信小程序·django·flask·uni-app·node.js
一 乐1 天前
个人健康系统|健康管理|基于java+Android+微信小程序的个人健康系统设计与实现(源码+数据库+文档)
android·java·数据库·vue.js·spring boot·生活
老华带你飞1 天前
医疗保健|医疗养老|基于Java+vue的医疗保健系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·医疗保健
⑩-1 天前
苍穹外卖Day(1)
java·数据库·spring boot·spring·java-ee·mybatis
q***7481 天前
私有化部署DeepSeek并SpringBoot集成使用(附UI界面使用教程-支持语音、图片)
spring boot·后端·ui
星光一影1 天前
Java版社交系统/聊天系统/im/即时通信/社交通讯
java·spring boot·mysql·交友