7

Hibernate セッションから取得したクラスのインスタンスがあります。そのセッションはとうの昔になくなっています。今、私は呼び出しており、インスタンスの読み込み中に Hibernate が解決しなかった参照 (遅延読み込み) にアクセスしようとしているtoString()ため、期待どおりの結果が得られています。LazyInitializationException: could not initialize proxy - no Session

クエリを約 120 文字から 4KB 以上 (8 つの結合) に変更するため、ロードを熱心にしたくありません。必要はありません。表示したいtoString()のは、参照されているオブジェクトの ID だけです。つまり、この時点で Hibernate が知る必要のあること (または遅延読み込みを実行できなかった場合)。

だから私の質問:このケースをどのように処理しますか?で参照を使用しようとしないでくださいtoString()toString()それとも、念のためローディング コードを呼び出しますか? または、怠惰な参照を渡すと便利なものを返す Hibernate のユーティリティ関数がありますか? toString()それとも、参照を完全に避けますか?

4

4 に答える 4

6

これは、ID フィールドの accesstype を「property」に設定することで可能です。お気に入り:

@Entity
public class Foo {
    // the id field is set to be property accessed
    @Id @GeneratedValue @AccessType("property")
    private long id;
    // other fields can use the field access type
    @Column private String stuff;
    public long getId() { return id; }
    public void setId(long id) { this.id = id; }
    String getStuff() { return stuff; }
    // NOTE: we don't need a setStuff method
}

ここ で説明 します. このようにして、プロキシの作成時に常に id フィールドが入力されます。

于 2009-11-12T14:21:38.210 に答える
1

I've found a workaround:

public static String getId (DBObject dbo)
{
    if (dbo == null)
        return "null";

    if (dbo instanceof HibernateProxy)
    {
        HibernateProxy proxy = (HibernateProxy)dbo;
        LazyInitializer li = proxy.getHibernateLazyInitializer();
        return li.getIdentifier ().toString ();
    }

    try
    {
        return Long.toString (dbo.id ());
    }
    catch (RuntimeException e)
    {
        return "???";
    }
}

So what this code does is it fetches the ID (a 64bit number) from the object. DBObject is an interface which defines long id(). If the object is a Hibernate proxy, then I talk to its LazyInitializer to get the ID. Otherwise, I call id(). Usage:

class Parent {
    DBObject child;
    public String toString () {
        return "Parent (id=..., child=" + getId(child)+")");
    }
}
于 2009-11-12T14:09:20.000 に答える
0

オブジェクトの ID だけを返したい場合は、getID() を呼び出して、表示したい瞬間に int/long を String 値として解析すると問題なく動作します。少なくとも、それは質問に基づいてどのように見えるかです。

編集

JPA と Hibernate を使用して LazyInitializationException を解決する方法

コメントを見て検索を行った後、これがあなたのシナリオに最も役立つと思います。

于 2009-11-12T13:13:58.020 に答える