1

merge() の推奨される使用方法は、変更を入力する前にまず DTO を取得することです。

public void merge(PersonModel model) {

Person inputDTO = PersonBuilder.build(model)

Person dto = get(pk)
dto.setName(inputDTO.getName())

dto.getChildren().clear()

Iterator<Child> iter = inputDTO .getChildren().Iterator();

while(iter.hasNext()){
   dto.getChildren().add(iter.next());
}

dto.merge();

}

データが誤って削除されないように、ドメイン モデルを dto に変換してマージするような操作を実行する、よりエレガントな方法はありますか。

問題の例: Hibernate: merge() の使用時に孤立した削除を防止します。

リストをクリアして追加する必要があるのは非常に無駄だと思います。

誰かが私にデザインパターンやそれを適切にコーディングする方法を勧めてくれますか?

ありがとうございました

拡張機能:

1) Hibernate Hashset を使用して List を置き換えることは可能ですか? 休止状態のハッシュセットは、主キーに基づいて要素を置き換えますか?

助けはありますか?

4

1 に答える 1

3

「merge()を使用する推奨される方法は、変更を入力する前に、最初にDTOを取得することです」

誰があなたにこれをするように勧めましたか?

「ドメインモデルをdtoに変換してマージし、データが誤って削除されないようにする、このような操作を実行するためのより洗練された方法はありますか?」

ドメインオブジェクトをDTOに変換できるとは思いません。DTOはデータに関するものであり、ドメインオブジェクトはデータ、動作、およびコンテキストです。全然違う。

ドメインオブジェクト(別名、貧血ドメインモデル)に動作とコンテキストがない場合は、オブジェクトを複製するだけの追加のDTOレイヤーは必要ありません。

この質問にHibernateのタグを付け、質問で言及したので、データベースからオブジェクトを取得したばかりで、Hibernateがセッションをフラッシュして変更をデータベースと同期するため、mergeを自分で呼び出す必要はありません。

「Hibernateハッシュセットを使用してリストを置き換えることは可能ですか?Hibernateハッシュセットは主キーに基づく要素を置き換えますか?」

データが格納されるテーブルはリストではなくセットであるため、リストをハッシュセットに置き換えます(重複するレコードを持つことはできません)。ハッシュセットは、主キーに基づく要素を置き換えません。セット(任意のセット、Hibernateの実装も同じです)は、重複を防ぐことで機能します。equals()とgetHashCode()の実装を使用して、そのセットにすでにオブジェクトが存在するかどうかを確認します。その場合、追加されませんが、元の状態が維持されます。

于 2012-08-01T10:27:14.913 に答える