Hibernate ドメイン オブジェクトが与えられた場合、それを検索する以外に、それがライブ (つまり、データベースに存在する) かどうかを判断できる方法はありますか? より効率的な方法がありますHIbernate.isObjectLive(domainObj)
か?domainObj.amIAlive()
私はHibernateに比較的慣れていません。答えが「いいえ」の場合、それで問題ありません。前もって感謝します。
Hibernate ドメイン オブジェクトが与えられた場合、それを検索する以外に、それがライブ (つまり、データベースに存在する) かどうかを判断できる方法はありますか? より効率的な方法がありますHIbernate.isObjectLive(domainObj)
か?domainObj.amIAlive()
私はHibernateに比較的慣れていません。答えが「いいえ」の場合、それで問題ありません。前もって感謝します。
Hibernate は、データベースをチェックすることによって、その定義によってオブジェクトが「生きている」かどうかを知るだけです。それが事実であるかどうかを確認するために使用する必要がありますSession.get(object.getClass(), object.getId())
。オブジェクトがデータベースに存在しなくなった場合は null を返します。
にはキャッシュがあることに注意してくださいSession
。そのため、オブジェクトが既にそのキャッシュにあるが、その間にデータベースから削除されている場合、Session.get(...)
は参照を返します。このためSession
、チェックを行う前に新しいものを取得することをお勧めします。
最も効率的な方法は次のようになると思います
select o.id from Entity o where o.id=?
。これが空の結果を返す場合、そこにはオブジェクトがありません。
別のオプション (おそらくこれは並行環境で望ましい) は、オプティミスティック ロックを使用して、オブジェクトがデータベースに格納されたバージョンを持ち、それを保存するときに次のようなことを行うことですupdate Entity set ... where id = ? and version = ?
。オブジェクトが既に古い (更新または削除されている) 場合は、例外がスローされます。
ただし、 session.get() も機能します。オブジェクトがセッションレベルのキャッシュにあると予想される場合は、実行する前に session.evict(object) を呼び出す必要があります。