0

Hibernateに関しておそらく恥ずかしいほど簡単な質問があります。

オブジェクトの永続化されたインスタンスがあり、これらのオブジェクトのプロパティの一部が同じ内部で変更されている場合Session、それらの変更は私にも表示されますか?

またはrefresh、現在の状態を取得するためにオブジェクトを取得する必要がありますか?


私の質問を拡張したいと思います:これらの変更が同じ内部で行われない場合はどうなりSessionますか?Sessionそれらが同じによって提供されるで作られている場合はどうなりSessionFactoryますか?

4

2 に答える 2

2

エンティティを 2 回以上ロードした場合 ( または を使用するかどうかは関係ありませんQuery.list()) Session.load()、常に Java オブジェクトの同じインスタンスを取得します。同じインスタンスであるため、このインスタンスの各変更は、このインスタンスを使用する場所に表示されます。したがって、これは、データベースに永続化されていない変更の場合にも当てはまります (これは特定の危険です)。

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

于 2012-06-26T12:14:38.273 に答える
0

更新は必要ありません。切り離されていない限り表示されます。

于 2012-06-26T11:34:19.257 に答える