hibernate.PersistentObjectException: отдельный объект, переданный для сохранения [duplicate]

С Коллекции Eclipse (ранее коллекции GS ) будет работать метод removeIf, определенный на MutableCollection :

MutableList list = Lists.mutable.of(1, 2, 3, 4, 5);
list.removeIf(Predicates.lessThan(3));
Assert.assertEquals(Lists.mutable.of(3, 4, 5), list);

С синтаксисом Java 8 Lambda это можно записать следующим образом:

MutableList list = Lists.mutable.of(1, 2, 3, 4, 5);
list.removeIf(Predicates.cast(integer -> integer < 3));
Assert.assertEquals(Lists.mutable.of(3, 4, 5), list);

Необходим вызов Predicates.cast(), потому что по умолчанию removeIf метод был добавлен на интерфейс java.util.Collection в Java 8.

Примечание: я являюсь коммиттером для коллекций Eclipse .

17
задан Alexis Dufrenoy 4 March 2013 в 11:59
поделиться

2 ответа

Persist предназначен для новых объектов переходного процесса, и он терпит неудачу, если идентификатор уже назначен. Вероятно, вы должны называть saveOrUpdate вместо persist.

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

entityManager.merge(yourObject);

, else

entityManager.persist(yourObject);
34
ответ дан Raul Rene 18 August 2018 в 00:19
поделиться
  • 1
    Конечно ... persist () нужно только вставить. Я изменил свой код, чтобы вызвать persist () для новых объектов и merge () для уже существующих объектов, и он отлично работает. Спасибо! – Alexis Dufrenoy 4 March 2013 в 12:25
  • 2
    Пожалуйста. Тем не менее, вы могли бы попытаться более внимательно изучить другие потоки SO. Я нашел по крайней мере 3, которые соответствовали вашей проблеме. – Raul Rene 4 March 2013 в 13:05
  • 3
    Я искал, но на этот вопрос слишком много вопросов. – Alexis Dufrenoy 4 March 2013 в 15:36
  • 4
    Чтобы решить, следует ли persist () или слить (), мне нужно выяснить, существует ли сущность в менеджере сущности. Как я могу это сделать? – Socrates 28 February 2016 в 08:45
  • 5
    Обычно идентификатор не сохраненного объекта должен быть 0 или -1. Таким образом, вы можете сделать что-то вроде этого: if (myEntity.getId () & gt; 0) {entityManager.persist (myEntity);} else {entityManager.merge (myEntity);} – flipperweid 25 April 2017 в 13:32

Основная проблема заключается в том, что вы загружаете объекты в один DAO:

boutique = daoAdmin.namedQuerySingle(
    Boutique.LOAD_BOUTIQUE_BY_IDWEBSC, fluxBoutique.getId());

Но затем сохраняя их с помощью другого:

boutiqueDao.persist(boutique);

В случае существующих сущностей это будет генерировать ошибку отдельного объекта, поскольку объект имеет идентификатор, но не существует в единице работы второго DAO. Конечно, даже если вы использовали один и тот же DAO для чтения / сохранения, вы все равно столкнетесь с проблемами, потому что вы не должны использовать persist для сохранения существующих объектов. Попробуйте это вместо:

Прочитайте сущности, используя тот же DAO, что и вы, чтобы их сохранить

boutique = boutiqueDAO.namedQuerySingle (Boutique.LOAD_BOUTIQUE_BY_IDWEBSC, fluxBoutique.getId ()) ;

Измените обработку новых бутиков, чтобы сделать немедленное сохранение объекта

if (boutique==null) {
    log.error("Dans le new");
    boutique = new Boutique();
    boutiqueDAO.persist(boutique);
}

Измените последнее сохранение на слияние

boutique.setIdWebSC(fluxBoutique.getId());
boutique.setDateModification(new Date());

boutique = boutiqueDao.merge(boutique);
4
ответ дан Perception 18 August 2018 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: