在Hibernate + Spring中插入与属性相同的对象

时间:2012-09-06 15:15:00

标签: spring hibernate spring-mvc

  

可能重复:
  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;
  // ...
}

在我的弹簧形式中,我有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获取,具体如下:

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

当我尝试保存一个有两个不同城市的人时,一切正常,但当我选择同一个城市时,我得到以下错误:

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调用cityDao.get(id)时获得的上一个City,所以我应该在某处使用merge(),但我不知道我到哪里可以申请这个..

1 个答案:

答案 0 :(得分:1)

问题是由于saveOrUpdate()Person级联到Cityupdate()失败,而Session与对象具有相同ID的对象失败已更新已与city

相关联

我认为此问题的最佳解决方案是从cityOfBirthCity中删除级联选项。

只要您的用户必须从现有城市列表中选择Person,级联就没有意义,因为您不需要将任何更改从City级联到{{ 1}}。

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

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