エンティティを 2 回以上ロードした場合 ( または を使用するかどうかは関係ありませんQuery.list()
) Session.load()
、常に Java オブジェクトの同じインスタンスを取得します。同じインスタンスであるため、このインスタンスの各変更は、このインスタンスを使用する場所に表示されます。したがって、これは、データベースに永続化されていない変更の場合にも当てはまります (これは特定の危険です)。
エンティティが 2 つの異なるセッションを使用して 2 回読み込まれた場合 (セッションが同じ SessionFactory からのものであるかどうかは関係ありません)、Java クラスの 2 つのインスタンスを取得します。これら 2 つのインスタンスは独立しています。一方のインスタンスは、他方のインスタンスでの変更について通知されません。これは、変更がデータベースに永続化されている場合にも当てはまりません。エンティティを再度ロードし、それが既にセッション キャッシュにある場合でも、変更は取得されません (例:エンティティが既にキャッシュにあったため、変更をロードしません session1.load(entity); session2.save(entity); session1.load(entity);
) 。プログラムの外部で SQL を使用して直接変更を行った場合も同様です。変更をロードするには、次のいずれかを行う必要がありますsession1
session2
evict()
インスタンスまたは新しいセッションを使用します。<version>
この場合、変更の損失を避けるために、バージョン化された列 (句にマップされた列) を使用することをお勧めします。