Hibernate - @OneToManymappedBy 继承抽象类

问题描述 投票:0回答:1

我的结构看起来像:

@Entity
@Table
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Container {
    @Id
    private Long id;
}

@Entity
@Table
@PrimaryKeyJoinColumn(name = "id")
public class Component extends Container {

    @ManyToOne
    @JoinColumn(name = "id_parent_container")
    private Container parentContainer;

    @OneToMany(mappedBy = "parentContainer")
    private Set<Component> content = new HashSet<>();

}

@Entity
@Table
@PrimaryKeyJoinColumn(name = "id")
public class Section extends Container {

    @ManyToOne
    @JoinColumn(name = "id_parent_section")
    private Section parentContainer;

    @OneToMany(mappedBy = "parentContainer")
    private Set<Container> children = new HashSet<>();

}

所以,我们有两个类,Component和Section,它们都是容器。一个部分可以包含子部分和组件(即容器),并且一个组件可以仅包含子组件。

当我启动此代码时,出现以下异常:

org.hibernate.AnnotationException: Collection 'xxx.entities.Section.children' is 'mappedBy' a property named 'parentContainer' which does not exist in the target entity 'xxx.entities.Container'

我所有的Container继承类都实现了parentContainer属性,但我不想把这个属性放在Container类中。这可能吗?

java hibernate jpa inheritance entity
1个回答
0
投票

我无法理解为什么你同时使用 Container 作为超类和属性。

@Inheritance(strategy = InheritanceType.JOINED)

您正在使用此注释,因此子类已经与超类 1..n 一对多关系相关。

毕竟,解决方案很简单,所以此时你很幸运。

@OneToMany(mappedBy = "parentContainer")
private Set<Component> content = new HashSet<>();

parentContainer 应该是 Component 类的属性,但我在 Component 类上看不到此属性。异常原因就是这样。

毕竟,我的建议是请删除 @OneToMany 部分,因为使用 InheritanceType.JOINED 完全符合您的尝试。

public class Section extends Container { //You inherit it there

@Inheritance(strategy = InheritanceType.JOINED) // InheritanceType using JOIN so it will add only one foreign key on your subtable (the foreign key is primary key of super table)
public abstract class Container {

JOINED:使用此策略,层次结构中的每个类都映射到其自己的表,但表中仅包含特定于该类的属性。这些表使用外键链接,并且基表中使用鉴别器列来标识子类。该策略在查询性能和数据完整性之间提供了良好的平衡,但在跨层次结构查询时需要额外的联接。

https://medium.com/@iampraveenkumar/mastering-jpa-inheritance-strategies-hibernate-6-x-jpa-3-x-spring-boot-3-x-06eecac1147a

如果还不够,Baeldung 是很好的来源。

https://www.baeldung.com/hibernate-inheritance

祝你好运:)

© www.soinside.com 2019 - 2024. All rights reserved.