0

可能重复:
Spring + Hibernate:具有相同标识符值的不同对象已与会话关联

我有以下对象(简化)作为 JavaBean:

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

在我的春季表格中,我有 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>

我的 City 类的 PropertyEditor 只需调用我的 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 当前知道在 propertyEditor 调用时获得的上一个 City cityDao.get(id),所以我应该在某处使用 merge() ,但我不知道应该在哪里应用它。 .

4

1 回答 1

1

问题是由于您级联saveOrUpdate()操作 fromPersonCity,并且update()当与要更新的对象具有相同 id 的对象已经与Session.

我认为这个问题的最佳解决方案是从city和中删除级联选项cityOfBirth

只要您的用户必须City从现有城市列表中选择一个,级联在这里就没有意义,因为您不需要级联任何更改 fromPersonCity

或者,您可以使用merge()而不是saveOrUpdate()

public void save (Person person) {
    hibernateTemplate.merge(person); 
} 
于 2012-09-06T15:51:22.977 回答