Hibernate继承-引用用@MappedSuperclass注释的实体

Hibernate继承-引用用@MappedSuperclass注释的实体,hibernate,inheritance,Hibernate,Inheritance,上述结构将提供一个例外: @MappedSuperclass public abstract class AbstractBaseModel{ } @MappedSuperclass public class Person extends AbstractBaseModel { } @Entity public class APerson extends Person { } @Entity public class BPerson extends Person { } @Entity

上述结构将提供一个例外:

@MappedSuperclass
public abstract class AbstractBaseModel{ }

@MappedSuperclass
public class Person extends AbstractBaseModel { }

@Entity
public class APerson extends Person { }

@Entity
public class BPerson extends Person { }

@Entity
public class Course extends AbstractBaseModel { 
  @ManyToOne
  @JoinColumn(name ="person")
  private Person person;
}

它说您不能在映射中使用Person,因为它不是一个具体的实体。如何实现这样的继承场景?

很简单,您可以将
Person
上的
@MappedSuperclass
注释更改为
@Entity

仅当您明确不希望类可查询或不希望类是关系的一部分时,才使用
@MappedSuperclass
<代码>@实体其他地方


判断超类是否为
abstract
——如果是,则使用
@MappedSuperclass
,就像您在
AbstractBaseModel

上所做的那样。在这种情况下,hibernate只创建Person类。它没有创造出一个人或一个人。Person实体合并了APerson和BPerson。@user706071-我不知道你的意思。Hibernate不生成类。一个人和一个人有什么不同?难道它们没有额外的属性,只是行为上的差异吗?APerson和BPerson类有自己的属性,而不是普通的属性(Person)。无论如何,谢谢你的回复。我将采用你建议的方法。Hibernate创建了一个名为Person的表,合并了APerson和BPerson的所有属性,并添加了一个DTYPE属性来区分子类类型。由于我的APerson和BPerson没有太大的不同,这种继承对我来说是适用的。如果它们有,hibernate应该能够映射它们。也许这是继承设置的一个问题——如果您不使用不同的继承策略对其进行注释,则从AbstractBseModel派生的所有实体都将放在一个表中(默认情况下为single_表)。你可以试着确定额外的表是真的生成的。我有一个类似的问题。你愿意帮我吗?以下是链接:
Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on    
Course references an unknown entity: Person
@Entity
@Table(name="PERSON")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="discriminator",discriminatorType=DiscriminatorType.STRING)
public absract class Person extends AbstractBaseModel { }

@Entity
public class APerson extends Person { }

@Entity
public class BPerson extends Person { }

@Entity
public class Course extends AbstractBaseModel { 
  @ManyToOne
  @JoinColumn(name ="person", **insertable = false, updatable = false** )
  private Person person;
}