非正規化された冬眠をマップします
-
30-09-2019 - |
質問
品質のリストを含む要約クラスがあります。品質には、文字列名とint値が含まれています。このデータは、概要と品質の両方で、非正規化DB構造、1つのテーブルのみに保存されます。
品質テーブル:
id、somefileds、qualityname1、qualityvalue1、qualityname2、qualityvalue2、qualityname3、qualityvalue3
各品質の名前と値のペアごとに、概要クラスに新しい品質オブジェクトを挿入する必要があります。
これをHibernate(XML Hibernateマッピング)にマッピングする方法は?
解決
方法は明らかではありません Quality
オブジェクトはに「挿入」する必要があります Summary
ホルダークラスですが、カスタムユーザータイプ(どちらも o.h.u.UserType
また o.h.u.UserCollectionType
)ここに行く方法です。
セクションを参照してください 5.2.3。カスタム値タイプ 詳細については、ドキュメントでは、マッピングについてはあまり言うことはありません。カスタムユーザータイプを次のように指定するだけです。 type
マッピングで)。
他のヒント
カスタムcompositeusertype実装でそれを修正することができました。マッピングファイルは次のように見えます。
<property name="qualities" type="com.foo.bar.QualityCompositeUserType">
<column name="linkName1" />
<column name="linkQuality1" />
<column name="linkName2" />
<column name="linkQuality2" />
<column name="linkName3" />
<column name="linkQuality3" />
</property>
compositeusertypeのreturnclassはlist.classです。nullsafesetメソッドは、コレクションを値引数として取得します。リストから値を取得し、準備されたステートメントのパラメーターに割り当てるだけの問題です。 (そして、品質のリストに値が欠落している場合、nullで埋めます)。
nullsafegetメソッドは簡単です。結果セットの値で新しい品質オブジェクトが挿入される新しいアレイリストを作成するだけです。
興味があれば完全な例を追加できます。