0

「エンティティIDで差分を保存する」という質問に対して、次の回答が見つかりました。

「エンティティの場合、Id プロパティを null にすることはできないため、このクラスを ValueObject としてマップする必要があります。その場合、Id プロパティは通常のプロパティとして扱われ、このオブジェクトの GlobalId には移動しません。」

私の質問は:

Id が NULL の場合、エンティティを NEW として扱うことができないのはなぜですか?

データベースからフェッチされたオブジェクト グラフがあり、2 つの javas コミットの間にエンティティがグラフのリストに追加されます。

  1. 2 つのコミットと 2 番目のコミットには新しいエンティティがあります (ID NULL)
  2. Java は GlobalId を作成できないため、change => 例外を取得します。

EntityManager - persist (Id:s を作成) を実行することでこれを回避できますが、それは避けたいと思います。現在のコードは、後で永続化するか、トランザクションを終了させるだけです。

Id が NULL であるため、エンティティは NEW です。GlobalId を作成できるように、一意の一時 ID (Id = NULL を許可) を生成することは可能でしょうか? 変更リストでは、エンティティは NEW として報告されます。以前のコミットと比較する必要はありません。

4

1 に答える 1

1

オブジェクトが完全に初期化されているとき、つまり ID があるときは、オブジェクトを比較/コミットする必要があります。

Id のないエンティティは、いくつかの理由で JaVers で処理できません。

  • 他のエンティティ/バージョンと比較することはできません (差分アルゴリズムは GlobalIds に基づいています)
  • JaVersRepository からクエリすることはできません (クエリは GlobalIds を使用します)

Hibernate を使用している場合は、Hibernate がシーケンスから ID を割り当てた後で新しいオブジェクトを比較/コミットします。

別のオプション:

  • シーケンスで生成された値を JaVers Id として使用しないでください。
  • エンティティにビジネス ID がない場合は、コンストラクターで UUID を生成し、それを JaVers ID (および必要に応じてデータベース PK) として使用できます。
于 2017-08-23T13:03:49.140 に答える