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