1

OneToMany以下のエンティティなど、他のエンティティと関係を持つエンティティがありBoatます。実際には、エンティティには多くのフィールドがあります。

@Entity
public class Boat {
    @Id
    private long id;
    private String name;

    @OneToMany(fetch=FetchType.EAGER)
    private List<Gun> guns;

    public List<Gun> getGuns() {
        return guns;
    }

    public String getName() {
        return name;
    }
}

一部の検索では、の基本属性のみに関心があり、関係Boatを取得したくありませんOneToMany。1 つのオプションは、すべてのOneToMany関係を と作成することfetch=FetchType.LAZYです。

ただし、遅延読み込みは 2 つの問題を引き起こします。

  1. 遅延読み込みは、OneToMany私が必要としない関係の周りにプロキシを作成します。OneToManyリレーションシップにアクセスする必要はまったくなく、可能な限りパフォーマンスを改善する必要があります。
  2. 他の多くのクエリでは熱心なフェッチが必要であり、すべてOneToManyManyToOne関係を遅延フェッチに変更すると、他のクエリが面倒になります。

遅延フェッチを使用せずに、どの関係を動的に取得するかを選択する方法はありますか? これは標準のJPQLを使用して可能ですか?

GlassfishでEclipseLinkを使用しています。

私は以前にEclipseLinkフェッチグループを調査しましたが、これは私の問題に取り組んでいます。ただし、この問題に遭遇しました: https://stackoverflow.com/questions/19577864/classdescriptor-returns-null-fetchgroupmanager-when-trying-to-create-an-eclipsel

4

1 に答える 1

1

名前やその他の基本的な属性だけが必要な場合は、ボート エンティティを返さないでください。JPAは、あなたが求めているものであれば、管理されたエンティティではなく生データを返すことを許可します。常に必要とは限らないリレーションシップで遅延を使用すると、速度が向上しますが、速度が低下するわけではありませんが、シリアライゼーションが関係する可能性があり、リレーションシップが必要な場合は計画が必要です。Eclipselinkは、必要に応じてエンティティを部分的にロードするためのフェッチおよび属性グループも提供します。詳細については、 http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroupを参照してください。

于 2013-10-27T16:12:11.353 に答える