2014-03-04 2 views
1

나는 Country, City 및 People이라는 테이블이 있습니다. 동일한 객체를 저장하기 위해 최대 절전 모드를 방지하려면 어떻게해야합니까? 여기 내 클래스이며, 문제는 국가 개체를 저장하려고하면, Hibernate는 예상대로 개체 같은 사람을 저장하거나 업데이트하려고입니다 (시의 사람들이 반대하고 나라의 사람들이 같은 PK를 가지고 객체)최대 절전 모드로 동일한 개체를 저장하지 못하게하는 방법

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session 

클래스.;

class Country{ 

..... 

@JoinColumn(.....) 
@ManyToOne(optional = false, fetch = FetchType.EAGER) 
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) 
private City city; 


@JoinColumn(.....) 
@ManyToOne(optional = false, fetch = FetchType.EAGER) 
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) 
private People people; 

} 

class City{ 

.... 

@JoinColumn(.....) 
@ManyToOne(optional = false, fetch = FetchType.EAGER) 
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) 
private People people; 

} 

내 저장 방법은 다음과 같습니다. 여기

public void save(){ 

    .... 


    getCurrentSession().saveOrUpdate(customer); //Hibernate session 


} 
+0

엔티티를 사용하여 코드를 게시 할 수도 있습니까? – Julien

답변

1

이 솔루션 :

  • 사용 merge 대신 save
  • 또는 save 캐스케이드 주석을 제거합니다. 모두 savesave 폭포는 기본적으로 최대 절전 모드 알려줍니다 사용

"새로운 모든 자신의 관계와 함께이 새로운 객체를 계속하십시오." 너는 그걸 원하지 않아.

+0

@Cascade (org.hibernate.annotations.CascadeType.SAVE_UPDATE)에서 @Cascade (org.hibernate.annotations.CascadeType.MERGE)로 변경하는 것으로 충분합니까? 나는 병합이 실제로 무엇인지 모른다. – hellzone

+0

참조하십시오. http://stackoverflow.com/questions/170962/nhibernate-difference-between-session-merge-and-session-saveorupdate => "에서 있었던 개체를 업데이트하려는 경우 Merge()를 사용해야합니다. 한 점이 세션에서 분리 된 경우 특히 세션에 현재 연결된 객체의 영구 인스턴스가있는 경우 특히 그렇습니다.이 경우 SaveOrUpdate()를 사용하면 예외가 발생합니다. " – KeatsPeeks

관련 문제