Hibernate 每类表的鉴别器

Hibernate 每类表的鉴别器,hibernate,jpa,eclipselink,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 = Fet

我有以下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;
}
因此,每个实体都可能有一个在编译时未知类型的父实体。由于使用了表\每\类层次结构,所以不会生成BaseEntity表,但其属性将在每个子类中重复。因此,每个子类都有以下字段:pk-主键、attr-some属性、parent_id-对父类的引用。但父id不会是外键,因为我们不知道它引用的是哪个表

因此,当我想要获得实体的父实体时,Hibernate/EclipseLink将遍历所有实体,直到找到具有给定父实体id的实体。不是很有效,不是吗?如果将父类型存储为鉴别器列,则过程可能会简单得多。因此,可以通过父类型和父id找到父项


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

在EclipseLink中,您可以使用@VariableOneToOne映射进行此操作

但是,一般来说,您可能希望重新考虑每个类使用表的情况,与其他继承策略相比,它效率低下

看,,

FWIW我很确定DataNucleus JPA在这种情况下会生成一个鉴别器列,因为您确实花了时间请求了一个。这些实体是否总是有一个与父实体类型相同的实体??例如,Scl的父级是否总是Scl??