You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate单表继承下多对多关联mappedBy报错及实现方案咨询

错误原因
  • 拼写错误:ExampleClass 类中 @ManyToMany(mappedBy = "exapmleClasses") 的属性名拼写错误,正确拼写应为 exampleClasses。
  • 关联属性位置不匹配:exampleClasses 属性仅定义在 EntryTypeOne 和 EntryTypeTwo 两个子类中,父类 Entry 不存在该属性,因此 Hibernate 无法在 Entry 类中找到你配置的映射目标。
解决方案

你完全可以只维护一份关联实现需求,最优方案是将两个子类重复的多对多关联属性移到父类 Entry 中,两个子类自动继承该属性,无需重复配置,修改后的代码如下:

@Getter
@Setter
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="entryType",
        discriminatorType = DiscriminatorType.STRING)
public class Entry {
    @Id
    @GeneratedValue
    protected Long id;

    @Column(nullable = false)
    protected String title;

    @Column(nullable = false)
    protected String description;
    
    // 两个子类共用的关联移到父类统一维护
    @ManyToMany(cascade = CascadeType.ALL)
    private List<ExampleClass> exampleClasses;
}
@Getter
@Setter
@Entity
@DiscriminatorValue("One")
public class EntryTypeOne extends Entry{
    // 仅需定义子类独有的属性即可,无需重复声明exampleClasses
}
@Getter
@Setter
@Entity
@DiscriminatorValue("Two")
public class EntryTypeTwo extends Entry{
    // 仅需定义子类独有的属性即可,无需重复声明exampleClasses
}
@Getter
@Setter
@Entity
public class ExampleClass {

    @Id
    @GeneratedValue
    private Long id;

    // 修正拼写错误,指向父类Entry的exampleClasses属性
    @ManyToMany(mappedBy = "exampleClasses")
    private List<Entry> entries;
}
方案说明
  • 仅需在父类维护一份关联逻辑,两个子类无需重复声明,符合代码复用原则
  • 适配你当前使用的单表继承策略,数据库仅会生成一张中间关联表存储 Entry 和 ExampleClass 的映射关系,不会产生多余表结构
  • 反向关联 ExampleClass.entries 可以正常返回所有关联的 Entry 实例(包含两个子类的实例)

内容的提问来源于stack exchange,提问作者Vincent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:15:01