2012-09-06 55 views
0

Possible Duplicate:
Spring + Hibernate : a different object with the same identifier value was already associated with the session插入相同的對象屬性在休眠+春

我有以下對象(簡化的)作爲一個JavaBean:

public class Person { 
    private Integer id; 
    private City cityOfBirth; 
    private City city; 
    // ... 
} 

而在我的彈簧形式I具有2個選擇連擊以選擇這兩個城市,具體如下:

<form:form method="post" action="" commandName="person"> 
City of birth: <form:select path="cityOfBirth" items="${ cities }" itemValue="id" /> 
City: <form:select path="city" items="${ cities }" itemValue="id" /> 
... 
</form:form> 

我對市級只會叫我CityDao的get屬性編輯器,至極如下:

@Component 
public class CityDaoImpl implements CityDao { 
    private @Autowired HibernateTemplate hibernateTemplate; 

    public City get (Integer id) { 
    return (City) hibernateTemplate.get(City.class, id); 
    } 
} 

而且我PersonDao的會,爲了做到這一點,以保存實例:

public void save (Person person) { 
    hibernateTemplate.saveOrUpdate (person); 
} 

一切工作正常,當我嘗試保存有2個不同城市的人,但是當我選擇相同的城市我獲得以下錯誤:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.project.si.models.common.City#90] 

我在其他職位讀過,這是因爲Hibernate的Session是目前知道時獲得屬性編輯叫cityDao.get(id)前面市,所以我suppo SED使用合併()的地方,但我沒有得到我應該申請這個地方..

+0

爲什麼你有'路徑=「cityOfBirth」'爲市場?這是一個錯字嗎?不應該是'path =「city」'? – limc

+0

你是對的@limc,這是一個錯字,我編輯了我的問題。謝謝 –

回答

1

的問題是,你從級聯PersonsaveOrUpdate()操作City造成的事實,並update()失敗時,對象以相同id作爲要更新的對象已與Session關聯。

我認爲這個問題的最佳解決方案是從citycityOfBirth中刪除級聯選項。

只要用戶必須從現有城市列表中選擇City,級聯在這裏沒有意義,因爲您不需要將PersonCity的任何更改級聯。

或者您可以使用的merge()代替saveOrUpdate()

public void save (Person person) { 
    hibernateTemplate.merge(person); 
} 
+0

刪除級聯選項將完全解決我的問題,謝謝! –