1

我有以下 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 生成这个鉴别器列来提高性能?

4

1 回答 1

0

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

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

见, http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_variableonetoone.htm

于 2012-09-04T14:07:36.323 回答