5

コンポーネント マッピングを使用して、Hibernate 永続オブジェクトのメンバーである不変オブジェクトがあります。例は、PinDropimmutable 型のフィールドを持つテーブルに対応しますPoint

public class PinDrop {
    private String name;
    private Point location;
    // Getters and setters for name and location
}

// Immutable Point
public class Point {
    private final double x;
    private final double y;
    // Getters for x and y, no setters
}

私の中でPinDrop.hbm.xml

<property name="name" column="name" type="string"/>
<component name="location" class="Point>
    <property name="x" column="location_x" type="double"/>
    <property name="y" column="location_y" type="double"/>
</component>

実行時に HibernateがandPointのセッターを持っていないと文句を言うため、これは機能しません。不変オブジェクトを Hibernate 永続オブジェクトのコンポーネントとして使用する方法はありますか?xy

フォローアップ: 私は注釈を使用していませんが、むしろhbm.xml. およびの有効な属性でmutableもありません。immutablecomponentpropertyhbm.xml

4

3 に答える 3

7

フィールド アクセス ( access=fieldhbm の属性) を使用するように hibernate に指示できるため、hibernate はアクセサーの欠落について文句を言いません。

Hibernate はリフレクションを使用して最終フィールドを変更し、動作するようにします。

于 2013-03-21T22:54:47.907 に答える
3

Hibernate は不変オブジェクトがあまり好きではありません。あなたの最良の選択肢は次のいずれかです

  • キーワードを使用しないfinalがセッターを持たない疑似不変オブジェクトを使用し、フィールドを介して値を設定するように Hibernate に指示します。
  • 休止状態で変更可能なビルダー オブジェクトを設定し、そのプロパティを適切な不変オブジェクトにコピーします。残念ながら、これは BO/DTO ごとに 2 つのクラスを持つことを意味します。
于 2013-03-21T23:30:53.637 に答える
1

@Immutableアノテーションを試しましたか?

エンティティまたはコレクションを不変としてマークします。注釈がないということは、要素が変更可能であることを意味します。

不変エンティティは、アプリケーションによって更新されない場合があります。不変エンティティへの更新は無視されますが、例外はスローされません。@Immutable は、ルート エンティティでのみ使用する必要があります。

@Immutable をコレクションに配置すると、コレクションが不変になります。つまり、コレクションへの追加やコレクションからの削除は許可されません。この場合、HibernateException がスローされます。

*.hbm.xml でテーブルを不変にするために私が知る限り、mutable="false"属性が役に立ちます。

于 2013-03-21T22:40:36.710 に答える