過去数日間、私は非常に苛立たしい問題に頭を悩ませてきました。
生成されたコードである休止状態のエンティティが多数あります。これは、次の@OneToManyコレクション(とりわけ)が作成されることを意味します。
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "tablename")
private java.util.List<classname> fieldname;
このアプリケーションでは、2番目のユーザーのためにこれらすべてをコピーできるようにしたいと考えています。これを行うには、これらすべてのクラスとフィールドを読み取り、後で(コンストラクターを介して)再作成します。ただし、このコレクションを読み取ると、Hibernateはコレクションをダーティとしてマークするように見えます。これは後で、Hibernateが最初に行を削除してから再度挿入しようとしたときに、データベースに書き込むときに奇妙な制約違反につながります。
私の問題はこれです:なぜHibernateはその行を削除してから挿入したいのですか?そして、なぜそれは失敗するのですか?
私の推測では、Hibernateはコレクション全体を再作成しようとします。これは、何らかの理由でHibernateがコレクションが変更されたと見なしているためです。ただし、これは明らかにそうではありません。
編集:コレクションを読んだ後にHibernateSession#evictを使用すると、問題が解決するように思われることを指摘しておく必要があります。しかし、これは非常にハッキーな感じがするので、私はもっと考え抜かれたものを好みます。