75

このエラーメッセージが表示されました:

エラー:コレクションへの共有参照が見つかりました:Person.relatedPersons

実行しようとしたときaddToRelatedPersons(anotherPerson)

person.addToRelatedPersons(anotherPerson);
anotherPerson.addToRelatedPersons(person);

anotherPerson.save();
person.save();

私のドメイン:

Person {

 static hasMany = [relatedPersons:Person];

}

なぜこれが起こるのか考えていますか?

4

12 に答える 12

64

私も同じ問題を抱えていました。私の場合、問題は、誰かがBeanUtilsを使用して1つのエンティティのプロパティを別のエンティティにコピーしたため、2つのエンティティが同じコレクションを参照することになりました。

この問題の調査に時間を費やしたことを考えると、次のチェックリストをお勧めします。

  • 次のようなシナリオを探して、コレクションへの内部参照entity1.setCollection(entity2.getCollection())getCollection返します(getCollection()がコレクションの新しいインスタンスを返す場合は、心配する必要はありません)。

  • clone()正しく実装されているかどうかを確認します。

  • を探しBeanUtils.copyProperties(entity1, entity2)ます。

于 2011-11-01T20:22:29.530 に答える
7

実践について解説。オブジェクトを保存しようとすると、次のようになります。

Set<Folder> folders = message.getFolders();
   folders.remove(inputFolder);
   folders.add(trashFolder);
   message.setFiles(folders);
MESSAGESDAO.getMessageDAO().save(message);

更新されたオブジェクトを親オブジェクトに設定する必要はありません:

message.setFiles(folders);

次のように親オブジェクトを簡単に保存します。

Set<Folder> folders = message.getFolders();
   folders.remove(inputFolder);
   folders.add(trashFolder);
   // Not set updated object here
MESSAGESDAO.getMessageDAO().save(message);
于 2012-09-07T09:11:18.197 に答える
5

このエラーの原因をオンラインで読むことも、休止状態のバグである可能性があります。うまくいくように見える回避策として、

session.clear()

データを取得した後、コミットして閉じる前にクリアする必要があります。例を参照してください。

//getting data
SrReq sr = (SrReq) crit.uniqueResult();
SrSalesDetailDTO dt=SrSalesDetailMapper.INSTANCE.map(sr);
//CLEAR            
session.clear();
//close session
session.getTransaction().commit();
session.close();
return dt;

データベースへの選択、更新または挿入にこのソリューションを使用します。このソリューションが機能するか、問題を引き起こす可能性があるかはわかりません。

私の問題はこれと 100% 等しい: http://www.progtown.com/topic128073-hibernate-many-to-many-on-two-tables.html

于 2016-08-10T15:56:37.657 に答える
3

私の場合、他のクラスからコードをコピーして貼り付けていたので、getter コードの書き方が悪いことに気づきませんでした。

@OneToMany(fetch = FetchType.LAZY, mappedBy = "credito")
public Set getConceptoses() {
    return this.letrases;
}

public void setConceptoses(Set conceptoses) {
    this.conceptoses = conceptoses;
}

すべてのリファレンスはコンセプトですが、get を見るとletrasesと表示されます

于 2016-06-23T21:21:34.450 に答える
2

エンティティを考えてみましょう:

public class Foo{
private<user> user;
/* with getters and setters */
}

そして、ビジネス ロジック クラスを考えてみましょう。

class Foo1{
List<User> user = new ArrayList<>();
user = foo.getUser();
}

ここでは、ユーザーとfoo.getUser()同じ参照を共有しています。ただし、2 つの参照を保存すると競合が発生します。

適切な使用法は次のとおりです。

class Foo1 {
List<User> user = new ArrayList<>();
user.addAll(foo.getUser);
}

これにより、競合が回避されます。

于 2017-08-07T09:32:03.933 に答える