サーチ…


EAGERフェッチタイプは使用しないでください

Hibernateは、2つのエンティティ( EAGERLAZY間の関係をマッピングするときに、2種類のフェッチを使用できます。

一般的に、 EAGERフェッチタイプは良い考えではありません。なぜなら、このデータが必要でないときでも、JPAが常にデータをフェッチするように指示するからです。

例のように、あなたがPersonエンティティを持っていて、次のようなAddressとの関係がある場合:

@Entity
public class Person {

  @OneToMany(mappedBy="address", fetch=FetchType.EAGER)
  private List<Address> addresses;

}

Personに照会するたびに、このPersonAddressのリストも返されます。

したがって、あなたのエンティティを以下のものとマッピングするのではなく、

@ManyToMany(mappedBy="address", fetch=FetchType.EAGER)

つかいます:

@ManyToMany(mappedBy="address", fetch=FetchType.LAZY)

注目すべきもう一つのことは@OneToOne@ManyToOne関係@ManyToOne 。どちらもデフォルトではEAGER です 。したがって、アプリケーションのパフォーマンスが懸念される場合は、このタイプの関係のフェッチを設定する必要があります。

@ManyToOne(fetch=FetchType.LAZY)

そして:

@OneToOne(fetch=FetchType.LAZY)

継承の代わりに合成を使用する

Hibernateにはいくつかの継承戦略があります。 JOINED継承型は、子エンティティと親エンティティの間でJOINを実行します。

このアプローチの問題は、Hibernateが常に関連するすべてのテーブルのデータを継承に持ち込むことです。

たとえば、 JOINED継承型を使用するエンティティBicycleおよびMountainBikeがある場合は、次のようになります。

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Bicycle {

}

そして:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class MountainBike extends Bicycle {

}

MountainBikeを襲ったJPQLクエリはBicycleデータを取得し、次のようなSQLクエリを作成します。

select mb.*, b.* from MountainBike mb JOIN Bicycle b ON b.id = mb.id WHERE ...

Bicycle用の別の親を持っている場合(例としてTransportように)、上記のクエリはこの親からのデータも取得し、余分なJOINを行います。

ご覧のとおり、これはEAGERマッピングの一種です。この継承ストラテジを使用してMountainBikeテーブルのデータのみを取得する選択肢はありません。

パフォーマンスにとって最高ののは、継承の代わりに使用の合成です。

これを実現するには、 MountainBikeエンティティをフィールドbicycleマッピングすることができます。

@Entity
public class MountainBike {

    @OneToOne(fetchType = FetchType.LAZY)
    private Bicycle bicycle;

}

そしてBicycle

@Entity
public class Bicycle {

}

すべてのクエリはデフォルトでMountainBikeデータのみを持ちます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow