2

クエリから返された Hibernate オブジェクトが信頼できない状況に遭遇しました。

次のコードを検討してください。

MyClass myClass = myDAO.get(id);

myClass.getId(); //This works
myClass.getName(); //This returns null sometimes, and works sometimes

これが私のgetメソッドです:

@SuppressWarnings("unchecked")
public T get(ID id) 
{
    Session s = getSession();
    T entity = (T) s.load(getPersistentClass(), id);
    s.disconnect();
    return entity;
}

これで、このオブジェクトがプロキシであり、遅延ロードされることは理解できましたが、常に機能するか、まったく機能しないことが予想されます。ここで何か間違ったことをしていますか?

4

2 に答える 2

3

これが原因である場合とそうでない場合がありますが、おそらく を使用Session.load()するべきではなく、 を使用する必要がありますSession.get()

load()休止状態によって現在読み込まれている永続的なインスタンスを返します。これは、以前に何が起こったかによって部分的に読み込まれる可能性があります。

get()より堅牢です。それを試してみてください。

于 2009-07-16T15:00:22.700 に答える
1

問題は、「ロード」がオブジェクトのプロキシをロードし、実際にはデータベースにヒットしないことです。ただし、オブジェクトがすでにロードされている (および移入されている) 場合、つまりレベル 1 キャッシュにある場合は、そのインスタンスがプロビジョニングされます。

load を使用すると、絶対に必要な場合、つまりオブジェクトのフィールドの 1 つを要求した場合にのみ、実際にデータベースにヒットします。

一方、Get は実際にデータベースにヒットします。

あなたの目的のために、 load を使用するか get を使用するかに関係なく、オブジェクトを返す前にオブジェクトが設定されていることを確認することをお勧めします。戻す前に、ゲッターの 1 つを呼び出します。その後、データが取り込まれていることを保証できます。

SQL ロギング (org.hibernate.SQL=DEBUG) を有効にしてデバッグし、どのような SQL 命令が実行されているかを確認すると便利です。

ロードしている永続オブジェクトを遅延しないように構成することも検討できます。そうすれば、load を使用する場合でも get を使用する場合でも、毎回完全に設定されたオブジェクトを取得できます。

于 2009-07-16T17:16:06.967 に答える