1

Hibernate と JPA で Play フレームワークを使用しています。

私は単純なエンティティを持っています:

@Entity
public class Player extends Model {

    @Required
    public Long gold;
}

すべてのプレイヤーを取得したいので、Hibernate を使用して実行するクエリを次に示します。

select p from Player p

結果はリストに保存されています。List<Player>デバッグしてリストの内容を確認したい場合、104 人のプレイヤーが表示されますが、リストの最初の 5 人のプレイヤーのみが実際に読み込まれます。他のプレイヤーは遅延フェッチされます: クラス名は のようなものPlayer_$$_javassist_22です。

私の質問は : すべてのプレーヤーが完全にロードされていないのはなぜですか? それらのいくつかが遅延フェッチされるのはなぜですか? 遅延フェッチなしですべてのプレーヤーをロードしたいのですが、どうすればよいですか?

ありがとうございました

4

3 に答える 3

1

XML hibernate マッピングでは、単純に次のように記述します。<class name="Player" lazy="false">...これにより、プレイヤー オブジェクトが熱心にフェッチされます。

注釈を使用すると、ここで@Proxy(lazy=false)説明されているように使用して同じことができます

ここで見つけることができる詳細情報

于 2013-09-03T13:25:38.317 に答える
0

最初に、 「プレーヤー」「チーム」'javax.persistence.FetchType' という 2 つのエンティティがあり、それらの間に関係があると仮定する概念を理解しましょう。@oneToMany

@Entity
@Table(name = "player")
public class Player extends Model {
    public Long gold;
    String name;    
}

@Entity
@Table(name = "team")
public class Team {
    @Column (name = "name") 
    public String name;

    @OneToMany(fetch = FetchType.LAZY,mappedBy="players")
    public List<Player> players;    
}

データベースからチームをロードすると、JPA がその名前フィールドをロードします。ただし、プレイヤーには 2 つのオプションがあります。チームの getPlayers() メソッドを呼び出すときに、残りのフィールドと一緒にロードするFetchType.EAGERか (eagerly[ ])、オンデマンドでロードするか (lazily[ ]) です。FetchType.LAZY

チームに多くのプレーヤーがいる場合、必要のないときにすべてのプレーヤーをロードするのは効率的ではありません。そのような場合、実際に必要なときにプレーヤーをロードするように宣言できます。これは遅延読み込みと呼ばれます。

FetchTypeあなたの問題に適しているのはあなた次第です。チームのロード中にすべてのプレイヤーをロードしたい場合は、 を使用しますFetchType.EAGER

これで問題が解決することを願っています....

于 2013-09-03T13:54:37.100 に答える