2014-03-04 45 views
1

我有名爲國家,城市和人民的表。我能阻止hibernate保存同一個人的對象嗎?這裏是我的課,問題是,當我試圖挽救一個國家目標,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

2解決方案在這裏:

  • 使用merge,而不是save
  • 或刪除save級聯註解。

同時使用savesave級聯基本上告訴Hibernate「請堅持用自己的各種人際關係這也是新的沿着這個新對象」。你不想那樣。

+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