次の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をdiscriminator列として格納すると、手順がはるかに簡単になる可能性があります。したがって、親は親タイプとparent_idによって検索されます。
hibernate / EclipseLinkにこの識別子列を生成させてパフォーマンスを向上させる方法はありますか?