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をdiscriminator列として格納すると、手順がはるかに簡単になる可能性があります。したがって、親は親タイプと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 に答える