TABLE_PER_CLASS的鉴别器

时间:2012-09-01 12:04:15

标签: hibernate jpa eclipselink

我有以下JPA映射。

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn
public class BaseEntity implements Serializable {
    @Id
    @GeneratedValue(strategy=GenerationType.TABLE)
    private Long pk;
    @ManyToOne(fetch = FetchType.LAZY)
    private BaseEntity parent;
}

@Entity
@Table(name="sclBase")
@DiscriminatorValue("sclBase")
public class SclBase extends BaseEntity {
    private String attr;
}

@Entity
@Table(name="scls")
@DiscriminatorValue("scls")
public class Scls extends BaseEntity {
    private String attr;
}

@Entity
@Table(name="scl")
@DiscriminatorValue("scl")
public class Scl extends BaseEntity {
    private String attr;
}

因此,每个实体都可以在编译时具有未知类型的父类。由于使用了table_per_class层次结构,因此不会生成BaseEntity表,但其属性将在每个子类中重复。因此每个子类都有以​​下字段:pk - 主键,attr - 某个属性,parent_id - 对父类的引用。但是父ID不是外键,因为我们不知道它引用了哪个表。

因此,当我想获取实体的父节点时,Hibernate / EclipseLink会遍历所有实体,直到它找到具有给定parent_id的实体。不是很有效,不是吗?如果将parent_type存储为鉴别器列,则该过程可以更简单。因此,父类型和parent_id将找到父类。

有没有办法让hibernate / EclipseLink生成这个鉴别器列以提高性能?

1 个答案:

答案 0 :(得分:0)

在EclipseLink中,您可以使用@VariableOneToOne映射。

但是,一般来说,您可能希望重新考虑使用TABLE_PER_CLASS,与其他继承策略相比效率低。

请参阅, http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_variableonetoone.htm