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
相关产品推荐
相关产品推荐

