マップされた複合識別子なしで複合 ID を宣言するオブジェクトのセッションで get を実行しようとしています。
使用される Hibernate のバージョンは 3.5.5 です。
コードのフェッチは一般的であり、実際のデータをラップするコンテナー オブジェクトを読み取ります。
ClassMetadata metadata =
session.getSessionFactory().getClassMetadata(wrapper.getDomainClass());
Serializable id = metadata.getIdentifier(wrapper, EntityMode.POJO);
return session.get(wrapper.getDomainClass(), id, LockOptions.UPGRADE);
コードは実際のマッピングについて何も知らないため、ID に関するメタデータを参照する必要があります。
マッピングが次のように定義されている場合:
<hibernate-mapping default-access="field">
<class name="Wrapper"
entity-name="Data"
table="DATA">
<composite-id>
<key-property name="identifier" column="identifier" />
<key-property name="version" column="version" />
</composite-id>
<component name="domainObject" class="Data">
<property name="source" column="source" />
</component>
</class>
</hibernate-mapping>
複合識別子クラスがない場合、id はオブジェクト自体と等しく、ラッパー参照と等しくなります。
データベースからオブジェクトをフェッチする代わりに session.get() を実行すると、id で渡されたのと同じオブジェクトが返されます (等しいオブジェクトではなく、オブジェクトの同じインスタンス)。
Upd:実際、session.get() はin
、id オブジェクトが渡したデータベースからオブジェクトをロードし、それを返します。最初は読み込みをスキップすると思っていました。
これまでに見つけた解決策は、マップされた複合識別子を導入し、マッピングを次のように変更することです。
<hibernate-mapping default-access="field">
<class name="Wrapper"
entity-name="Data1"
table="DATA_1">
<composite-id class="SurrogateKey" mapped="true">
<key-property name="identifier" column="identifier" />
<key-property name="version" column="version" />
</composite-id>
<component name="domainObject" class="Data">
<property name="source" column="source" />
</component>
</class>
</hibernate-mapping>
SurrogateKey は、必要に応じて 2 つのフィールドと equals/hashcode を持つオブジェクトとして定義されます。
この変更により、metadata.getIdentifier() によって返される id は SurrogateKey のインスタンスであり、session.get() はデータベースからオブジェクトをフェッチします (存在する場合)。
マッピング修正の問題は、基準と HQL のプロパティ名が識別子からid.identifierに変更され、実際には多くの既存のコードが壊れていることです。
私が現在調査していることは次のとおりです。
- Id クラスを宣言せずに session.get() を機能させる方法はありますか?
- 別の方法として、id を追加せずに、以前と同じようにプロパティを扱うように hibernate に指示することもできます。彼らの前では?
- hibernate を v4 にアップグレードしますか (依存プロジェクトと承認プロセスのために簡単ではありません)?
- 他に利用可能なオプション/回避策はありますか?
これまでのところ、上記の解決策しかできていませんが、邪魔にならないものを探しており、手がかり、提案、関連ドキュメントへのポインタをいただければ幸いです。