2016-10-08 2 views
4

Я экономить List с помощью спящего режима, но он бросает следующее исключение:Как решить org.hibernate.NonUniqueObjectException: другой объект с тем же значением идентификатора уже был связан с сессией:

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?

+1

Я обновил свой пост, но я все еще думаю, что это будет полезно для других, если включить следующую информацию: ** 1) ** Какая * конкретная * строка выдает исключение? (Пройдите код, чтобы узнать, если необходимо.) ** 2) ** Вы читали javadocs для метания метода? При каких обстоятельствах он претендует на то, чтобы бросить, если вообще? Что неясно? ** 3) ** Какие другие вещи вы попробовали, которые могли бы предоставить больше информации? Возможно ли [MCVE] (http://stackoverflow.com/help/mcve), чтобы другие могли воспроизводить? Если да, отправьте сообщение. – ray

ответ

0

Основная причина или причина этой ошибки: в вашем списке есть объекты с одним и тем же основным ключом, это означает два объекта с одним и тем же первичным ключом, но они не являются одним и тем же экземпляром объекта.

Я предлагаю вам перечислить ваш список и напечатать значение первичного ключа и узнать, есть ли какой-либо объект с таким же значением первичного ключа. Просто поместите функцию печати в цикл for, чтобы напечатать значение первичного ключа для каждого объекта до вызова строки session.saveOrUpdate(bean);.

+0

my hibenate properties ' \t ' – Java

+0

@Java Использовать backticks 'для форматирования кода. Взгляните на ссылку уценки. – ray

1

Проблема в том, что объект с этим идентификатором уже существует в сеансе, используя слияние, исправит все ваши проблемы, но вы должны действительно изучить различия. Просто скопируйте это, и это сработает.

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

Вот хороший источник для получения дополнительной информации о спящей настойчивости связанных метод What are the differences between the different saving methods in Hibernate?

+0

hi merge означает сохранение и обновление? – Java

+0

@Java Я не знаю логику, которую вы пытаетесь реализовать, но вкратце, слияние также сохраняет или обновляет. Однако есть больше нюансов, проверьте ** ответы ** на этот вопрос для получения дополнительной информации: http://stackoverflow.com/questions/161224/what-are-the-differences-between-the-different-saving-methods- in-hibernate – SergeiBednar

+0

Я попытался сохранить список в db, я пробовал этот путь ** getHibernateTemplate(). saveOrUpdateAll (list); ** список сохраняется, но дубликаты также сохраняются, я имею в виду, что один из них повторяется несколько раз. – Java

Смежные вопросы

 Смежные вопросы