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

时间:2013-03-19 15:23:52

标签: 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
public class Course extends AbstractBaseModel { 
  @ManyToOne
  @JoinColumn(name ="person")
  private Person person;
}

上述结构将给出例外情况:

Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on    
Course references an unknown entity: Person

它表示你不能在映射中使用Person,因为它不是一个具体的实体。我如何实现这种继承方案?

2 个答案:

答案 0 :(得分:4)

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

仅在您明确不希望该类可查询的情况或关系的一部分时使用@MappedSuperclass。其他地方@Entity

一个好的启发式决定是看你的超类是abstract - 如果是 - 使用@MappedSuperclass,就像你在AbstractBaseModel上所做的那样

答案 1 :(得分:0)

@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;
}