0

伝統的に、私たちはs を避けよ LazyInitializationExceptionうとします。ただし、一時的に投げられるようにする必要があります。これは私がやろうとしていることの疑似コードです:

Session session = ...;

Customer customer = (Customer) session.get(Customer.class, 56);

// All eagerly fetched data is now in memory.

disconnectSession(session);

// Attempts to access lazy data throw LazyInitializationExceptions.
// I want to take advantage of this fact to *only* access data that 
// is currently in memory.

magicallySerializeDataCurrentlyInMemory(customer);

// Now that the in-memory data has been serialized, I want to re-connect
// the session.

reconnectSession(session);

このmagicallySerializeDataCurrentlyInMemoryメソッドは、メモリ内データcustomerとそれに関連するエンティティのシリアル化を再帰的に試行しLazyInitializationException、途中で s を吸収します。

試み #1: session.disconnect/session.reconnect

この試みでは、次のパターンを使用しました。

Connection connection = session.disconnect();

magicallySerializeDataCurrentlyInMemory(customer);

session.reconnect(connection);

残念ながら、それは s をスローしませんでしたLazyInitializationException

試み #2: session.close/session.reconnect

この試みでは、次のパターンを使用しました。

Connection connection = session.close();

magicallySerializeDataCurrentlyInMemory(customer);

session.reconnect(connection);

残念ながら、これによりsessionafter が役に立たなくなりましたsession.reconnect(connection)

一時的に s を強制するにはどうすればよいLazyInitializationExceptionですか?

4

1 に答える 1

1

セッションを一時的に閉じる方法はありません。できることは、セッションからエンティティを削除してから元に戻すことです。

session.evict(customer);
//do something will throw lazy load
session.refresh(customer);

接続して再接続するだけで、使用中の特定のJDBC接続を手動で管理できます。Hibernateセッションは、単一のJDBC接続よりも大きな概念です。接続はそれへの単なるリソースです。ライフサイクル全体を通じて多くの異なる物理データベース接続を使用することができ、1ビットは気にしません。切断してからセッションに何かをするように依頼すると、別の接続が確立されます。

于 2012-04-03T18:34:24.970 に答える