0

過去数日間、私は非常に苛立たしい問題に頭を悩ませてきました。

生成されたコードである休止状態のエンティティが多数あります。これは、次の@OneToManyコレクション(とりわけ)が作成されることを意味します。

@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "tablename")
private java.util.List<classname> fieldname;

このアプリケーションでは、2番目のユーザーのためにこれらすべてをコピーできるようにしたいと考えています。これを行うには、これらすべてのクラスとフィールドを読み取り、後で(コンストラクターを介して)再作成します。ただし、このコレクションを読み取ると、Hibernateはコレクションをダーティとしてマークするように見えます。これは後で、Hibernateが最初に行を削除してから再度挿入しようとしたときに、データベースに書き込むときに奇妙な制約違反につながります。

私の問題はこれです:なぜHibernateはその行を削除してから挿入したいのですか?そして、なぜそれは失敗するのですか?

私の推測では、Hibernateはコレクション全体を再作成しようとします。これは、何らかの理由でHibernateがコレクションが変更されたと見なしているためです。ただし、これは明らかにそうではありません。

編集:コレクションを読んだ後にHibernateSession#evictを使用すると、問題が解決するように思われることを指摘しておく必要があります。しかし、これは非常にハッキーな感じがするので、私はもっと考え抜かれたものを好みます。

4

1 に答える 1

2

結合テーブルに主キーがない場合、休止状態は常に新しいレコードを扱い、参照レコードを削除して新しいレコードを挿入しようとします。

ただし、結合テーブルに独自の主キーがある場合、主キーに null がある場合はレコードが挿入され、主キーの値が存在する場合は更新されます。それ以外の場合は、テーブルにあるがリストにないレコードが削除されます。

Hibernate では、新しいレコードまたは古いレコードを識別するために主キーが必要でした。それ以外の場合は、結合テーブルの場合は常に新しいものになります。

于 2013-03-05T09:38:27.707 に答える