JPA深度继承注释属性

时间:2012-01-11 19:40:10

标签: java java-ee inheritance jpa orm

我有一个分层的JPA映射,它是几个深度的类。像这样的东西

@Entity
@Inheritance(strategy= InheritanceType.SINGLE_TABLE)
public abstract class BaseEntityClass implements Serializable {

    // lots of stuff common to all my entities.

} 

@Entity
@Inheritance(strategy= InheritanceType.TABLE_PER_CLASS)
public abstract class EntityTypeOne extends BaseEntityClass {
   // stuff common to EntityTypeOne
}

@Entity
@Inheritance(strategy= InheritanceType.TABLE_PER_CLASS)
public abstract class EntityTypeTwo extends BaseEntityClass {
   // stuff common to EntityTypeTwo
}

我知道你使用@Inheritence方法和超类来定义映射策略。但是,这如何与深层次结构一起工作?我希望所有叶子类都映射到他们自己的表。我应该用BaseEntityClass做SINGLE_TABLE吗?

1 个答案:

答案 0 :(得分:2)

您的基类应标记为TABLE_PER_CLASS。以下是OpenJPA的示例:

@Entity
@Table(name="MAG")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Magazine {
    ...
}

@Entity
@Table(name="TABLOID")
public class Tabloid
    extends Magazine {
    ...
}

根据JPA JavaDocs,应在类层次结构的根目录中指定@Inheritance注释:

  

定义要用于实体类的继承策略   层次结构。它是在实体类中指定的,是实体的根   实体类层次结构。

规范未指定此注释是否可以放在子类上,因此其行为未定义。

所以要回答你在评论中提出的问题,如果你有这个层次结构:

SubSub -> Sub -> Base

您只需要使用Base注释@Inheritance(strategy = TABLE_PER_CLASS)