7

次のように定義されたモデルのアプリケーション セットに User エンティティがあります。

public class User extends Model {

    private String name;

    private byte[] sk;

    @Column(columnDefinition = "BINARY(272)")
    private byte[] pk;

    private int port;

    @OneToOne
    public Profile profile;

    @ElementCollection
    public List<String> friends;

    @ElementCollection
        public List<String> mirrors;
...
}

そして、アプリケーションの別の部分 (コントローラー クラス) のメソッドで、次のようにミラーのリストを取得して変更しようとしています。

    User u = User.connect(username);
    int port = ProfileFinder.getLocation(username, mirror);
    u.mirrors.remove(mirror);
    u.save();

これは、次のようなエラーをスローしています。

LazyInitializationException occured : failed to lazily initialize a collection of role: models.User.mirrors, no session or session was closed

これは、タグの一部の要素を誤解しているためだと思われますが@ElementCollection、これを修正する方法を誰かが明確にすることはできますか?

ありがとう。

4

4 に答える 4

10

デフォルトでは、XxxToMany関連付けと要素コレクションは遅延ロードされます。

これは、コレクションメソッドの1つが呼び出されたときに、必要な場合にのみコレクション要素がデータベースからロードされることを意味します。ただし、もちろん、これを機能させるには、エンティティをセッションに接続する必要があります。セッションが閉じられると、取得した例外がスローされます。

アノテーションのフェッチ属性を設定して熱心にロードするか、トランザクションでコレクションを初期化するクエリまたはサービスを使用してから、コレクションを返します。熱心にロードすると、コレクション要素が必要ない場合でも、常に熱心にロードされることに注意してください。

于 2012-05-24T17:27:34.330 に答える
0

はい、EAGER アノテーションを使用する必要がありますが、JB Nizet が言うように、これらの要素は常に積極的に読み込まれるため、注意が必要です。

于 2012-05-24T17:33:10.123 に答える