サーチ…
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
データのみを持ちます。