如何解决org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已与会话关联:

时间:2016-10-08 10:24:40

标签: java hibernate

我正在使用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的正确方法是什么?

2 个答案:

答案 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);行之前打印每个对象的主键值。