2016-12-28 1 views
1

私はアプリケーションでHibernateを使い始めました。また、カスタムクエリを使用するためにJPAリポジトリを使用しています。私はそれらの間に関係を持つ複数のエンティティを持っています。私は、結合カラムとキャッシュを使用して 'EAGER'としてフェッチモードを使用しました。私は、Hibernateが複数のselectクエリを作成して各エンティティをフェッチし、単一のクエリでそれを実行していないことを観察しました。Hibernate:Hibernateによってフェッチモードで複数選択されたクエリEager

以下

エンティティです:

@Entity 
@Table(name = "entity_a") 
public class EntityA implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    ... 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "entity_a") 
    @JsonIgnore 
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
    private Set<EntityB> entityB = new HashSet<>(); 

私はJPAのカスタムクエリを使用して、以下のように私のエンティティを取得しています:

EntityA entityA = entityARepository.findOneById(id); 

Hibernateは上記の文の選択クエリを発行します。

私はentityA.getEntityB()を実行するたびに、EntityBに対して別のselect文を発行します。これを避ける方法。 Hibernateを使用して、両方のエンティティを1回の選択で取得するにはどうすればよいですか?

答えて

0

EntityBには、entity_aという名前のフィールドが含まれていますか?名前は、mappedBy属性で宣言されたとおりにする必要があります。

一般に、JPAプロバイダはFetchType.EAGERモードを尊重する必要があります。これは設定ミスの問題です。それでも、JPAプロバイダは熱心な関係を熱心にロードする必要がありますが、1回のクエリでそれが保証されるわけではありません。ヒントとして使用できるHibernate固有のアノテーションがあります:@Fetch(FetchMode.JOIN)。それを試して、それが動作するかどうかを確認してください。

+0

ありがとうございます! Fetchアノテーションを使用すると、私のために働いた。 –

関連する問題