문제

이 오류 메시지를 받았습니다.

오류 : 컬렉션에 대한 공유 참조 : Person.RelatedPersons

내가 실행하려고 할 때 addToRelatedPersons(anotherPerson):

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

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

내 도메인 :

Person {

 static hasMany = [relatedPersons:Person];

}

왜 이런 일이 일어나는지 아십니까?

도움이 되었습니까?

해결책

Hibernate는 두 개 이상의 엔티티 인스턴스를 공유하려고 시도 할 때이 오류를 보여줍니다. 같은 컬렉션 참조 (예 : 수집 평등과 대조적으로 컬렉션 ID).

동일하게 의미합니다 수집, 수집 요소가 아닙니다 - 다시 말해 relatedPersons 둘 다 person 그리고 anotherPerson 동일해야합니다. 아마도 엔티티가로드 된 후 해당 컬렉션을 재설정하고 있습니까? 아니면 동일한 수집 인스턴스로 두 참조를 초기화 했습니까?

다른 팁

나는 같은 문제가 있었다. 제 경우에는 누군가가 Beanutils를 사용하여 한 엔티티의 속성을 다른 엔티티에 복사하여 동일한 컬렉션을 참조하는 두 개의 엔티티를 갖게되었습니다.

이 문제를 조사하는 데 시간을 보냈다는 점을 감안할 때 다음 점검 목록을 권장합니다.

  • 같은 시나리오를 찾으십시오 entity1.setCollection(entity2.getCollection()) 그리고 getCollection 컬렉션에 대한 내부 참조를 반환합니다 (GetCollection ()이 컬렉션의 새 인스턴스를 반환하면 걱정할 필요가 없습니다).

  • clone() 올바르게 구현되었습니다.

  • 찾다 BeanUtils.copyProperties(entity1, entity2).

연습에 대한 설명. 객체를 저장하려고한다면, 예를 들어 :

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);

온라인 읽기이 오류의 원인도 최대 절전 모드, 처럼 해결 방법 그것이 효과가있는 것 같고, 그것은 다음과 같습니다.

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

제 경우에는 다른 클래스에서 코드를 복사하고 붙여 넣었으므로 Getter 코드가 잘못 작성된 것을 알지 못했습니다.

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

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

모든 참조 개념 그러나 당신이 get says를 보면 letrases

나도 같은 문제를 겪었고 누군가가 사용했습니다 BeanUtils.copyProperties(source, target). 여기서 소스와 대상은 속성과 동일한 컬렉션을 사용하고 있습니다.

그래서 방금 아래처럼 딥 카피를 사용했습니다 ..

Java에서 컬렉션을 복제하는 방법 - Arraylist 및 Hashset의 깊은 사본

응용 프로그램에서 비슷한 예외에 직면했습니다. StackTrace를 조사한 후 예외는 FlushEntityEventListener 수업.

최대 절전 모드에서 4.3.7 MSLocalSessionFactory Bean은 더 이상 지원하지 않습니다 eventListeners 재산. 따라서 개별 최대 절전 모드 세션 Bean에서 서비스 레지스트리를 명시 적으로 가져온 다음 필요한 사용자 정의 이벤트 리스너를 설정해야합니다.

사용자 정의 이벤트 리스너를 추가하는 과정에서 해당 기본 이벤트 리스너가 해당 최대 절전 모드 세션에서 제거되어야합니다.

기본 이벤트 리스너가 제거되지 않으면 동일한 이벤트에 대해 등록 된 두 이벤트 리스너가 발생합니다. 이 경우 이러한 청취자를 반복하는 동안 첫 번째 청취자에 대해 세션의 모든 컬렉션은 도달 한 것으로 표시되며 동일한 컬렉션을 처리하면이 최대 절전 모드 예외가 발생합니다.

따라서 사용자 정의 리스너를 등록 할 때 해당 기본 리스너가 레지스트리에서 제거되어 있는지 확인하십시오.

엔티티를 고려하십시오 :

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

그리고 비즈니스 로직 클래스를 고려하십시오.

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

여기서 사용자와 foo.getUser() 동일한 참조를 공유하십시오. 그러나 두 참조를 저장하면 충돌이 발생합니다.

적절한 사용법은 다음과 같습니다.

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

이것은 갈등을 피합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top