Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决org.hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联:_Java_Hibernate - Fatal编程技术网

Java 如何解决org.hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联:

Java 如何解决org.hibernate.unUniqueObjectException:具有相同标识符值的不同对象已与会话关联:,java,hibernate,Java,Hibernate,我正在使用hibernate保存一个列表,但它会引发以下异常: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 我正在使用的代码如下所示,但我不知道它为什么会引发异常: public void save(List<UserItem> list) { //getHi

我正在使用hibernate保存一个
列表
,但它会引发以下异常:

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);
    }
}
公共作废保存(列表)
{
//getHibernateTemplate().saveOrUpdateAll(列表);
//getHibernateTemplate().deleteAll(列表);
sessFactory=getHibernateTemplate().getSessionFactory();
Session Session=sessFactory.getCurrentSession();
for(UserItem bean:list){
saveOrUpdate(bean);
}
}

保存
列表的正确方法是什么?

此错误的主要原因是,列表中有具有相同主键的对象,这意味着两个具有相同主键的对象,但它们不是相同的对象实例


我建议您迭代您的列表并打印您的主键值,然后找出是否有任何对象具有相同的主键值。在调用
session.saveOrUpdate(bean)之前,只需将print函数放入for循环中,即可打印每个对象的主键值行。

问题是会话中已经存在具有该id的对象,使用“合并”将修复所有问题,但您应该认真研究差异。只要复制这个,它就会工作

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);
    }
}
公共作废保存(列表)
{
//getHibernateTemplate().saveOrUpdateAll(列表);
//getHibernateTemplate().deleteAll(列表);
sessFactory=getHibernateTemplate().getSessionFactory();
Session Session=sessFactory.getCurrentSession();
for(UserItem bean:list){
session.merge(bean);
}
}
关于hibernate持久性相关方法的更多信息,这里有一个很好的来源

我已经更新了您的帖子,但我仍然认为如果您包含以下信息,对其他人会有所帮助:1)哪一行引发异常?(一步一步地浏览代码,看看是否需要。)2)您是否阅读了方法抛出的javadocs?在什么情况下,它声称会抛出,如果有的话?什么是不清楚的?3) 您尝试过哪些其他方法可以提供更多信息?是否可行,以便其他人可以复制?如果是,请发布one.my hibenate属性“”@Java使用backticks`进行代码格式化。看一看markdown引用。@Java我不知道您试图实现的逻辑,但简而言之,merge也会保存或更新。不过,还有更多的细微差别,请查看此问题的答案以了解更多信息:我尝试在db中保存列表,我尝试了getHibernateTemplate().saveOrUpdateAll(列表);列表已保存,但重复项也已保存,我的意思是一个记录显示多次。我的hbm properties user_ITEM_ID_SEQ@Java在使用我发布的代码时是否有问题?这一行在getHibernateTemplate().saveOrUpdateAll(列表);。所以我试着发代码。这也是行不通的