我的结构看起来像:
@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类中。这可能吗?
我无法理解为什么你同时使用 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:使用此策略,层次结构中的每个类都映射到其自己的表,但表中仅包含特定于该类的属性。这些表使用外键链接,并且基表中使用鉴别器列来标识子类。该策略在查询性能和数据完整性之间提供了良好的平衡,但在跨层次结构查询时需要额外的联接。
如果还不够,Baeldung 是很好的来源。
https://www.baeldung.com/hibernate-inheritance
祝你好运:)