サーチ…
EAGERフェッチタイプは使用しないでください
Hibernateは、2つのエンティティ( EAGERとLAZY間の関係をマッピングするときに、2種類のフェッチを使用できます。
一般的に、 EAGERフェッチタイプは良い考えではありません。なぜなら、このデータが必要でないときでも、JPAが常にデータをフェッチするように指示するからです。
例のように、あなたがPersonエンティティを持っていて、次のようなAddressとの関係がある場合:
@Entity
public class Person {
@OneToMany(mappedBy="address", fetch=FetchType.EAGER)
private List<Address> addresses;
}
Personに照会するたびに、このPersonのAddressのリストも返されます。
したがって、あなたのエンティティを以下のものとマッピングするのではなく、
@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データのみを持ちます。