別のエンティティ(CoverArt)への@OneToManyマッピングを持つエンティティクラス(Song)を持ち、カスケードをALLに設定すると、私はちょうど取得し、データベースからクラスのインスタンスと、セッション内だけで変更した場合、メインentiyを保存し、それがカバーアートCascadeType.ALLを使用している場合、Hibernateでトップエンティティを保存すると、関係するエンティティにuneccssaryアップデートが発生します
@Audited
@Entity
public class Song
{
@Id
@GeneratedValue
private Integer recNo;
@Version
private int version;
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
private List<CoverArt> coverArts;
....
}
を永続化するの世話をしましょう。しかし、私は、コードの後の時点で発見しますカバーアートのために何も変わっていないにもかかわらず、その曲にリンクされたすべてのカバーアートエンティティを更新させるソングエンティティの1つのフィールドは、なぜこれを行うのですか?
また、私はEnversを使用していると思いますが、CoverArtテーブルへの(一見)不必要な追加アップデートはEnversに不必要な監査テーブルを作成させるノックの影響を与えます。
カスケードタイプのアノテーションを削除しても、1つのフィールドを変更してもカバーアートエンティティが更新されることはなく、カバーアートを追加するときに余分なロジックを追加しても問題ありませんが、これを行う必要はありません。
あなたは何とかcoverArtsコレクションのインスタンスを変更できますか?休止状態がチェンジトラッキングを失う可能性があります。また、CoverArtがSongへの逆参照を持っている場合は、@OneToManyにinverse = trueを設定する方が良いです。 – Firo
それはどういう意味ですか、カバーアートを変更しません。逆参照はありません。 –
Hibernateは何とかCoverArtsが変更されたと考えています。フィールドへのHibernateコレクションのセットが交換された場合、または何らかの方法で変更されたためにすべてのプロパティの値が等しくない場合は、親への参照です。実際に変更されているフィールドを表示するには、dynamicupdate = trueをCoverArtに設定します。 – Firo