我正在使用hibernate保存List
,但它会抛出以下异常:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
我正在使用的代码如下,但我不知道它为什么抛出异常:
public void save(List<UserItem> list)
{
//getHibernateTemplate().saveOrUpdateAll(list);
//getHibernateTemplate().deleteAll(list);
sessFactory = getHibernateTemplate().getSessionFactory();
Session session = sessFactory.getCurrentSession();
for (UserItem bean : list) {
session.saveOrUpdate(bean);
}
}
保存List
的正确方法是什么?
答案 0 :(得分:2)
问题是会话中已经存在具有该id的对象,使用merge将解决您的所有问题,但您应该真正研究这些差异。只需复制它就可以了。
public void save(List<UserItem> list)
{
//getHibernateTemplate().saveOrUpdateAll(list);
//getHibernateTemplate().deleteAll(list);
sessFactory = getHibernateTemplate().getSessionFactory();
Session session = sessFactory.getCurrentSession();
for (UserItem bean : list) {
session.merge(bean);
}
}
这里有关于hibernate持久性相关方法的更多信息的良好来源 What are the differences between the different saving methods in Hibernate?
答案 1 :(得分:1)
此错误的主要原因或原因是,在列表中存在具有相同主键的对象,这意味着具有相同主键的两个对象但它们不是同一对象实例。
我建议您迭代列表并打印主键值,并找出是否有任何具有相同主键值的对象。只需将print函数放入for循环中,即可在调用session.saveOrUpdate(bean);
行之前打印每个对象的主键值。