Я использую JPA EntityManager для выполнения некоторых операций, и одна такая операция заменяет объект на другой объект, который имеет тот же @Id
. Итак, с учетом oldObject
и newObject
, что является лучшим способом удалить oldObject
и заменить его на newObject
?Лучший способ заменить объект с помощью EntityManager
Вот код, который не работает:
try
{
entityManager.getTransaction().begin();
entityManager.remove(oldObject);
entityManager.persist(newObject);
entityManager.getTransaction().commit();
}
catch (PersistenceException persistExc)
{
entityManager.getTransaction().rollback();
// do some stuff
}
Этот код получает следующее исключение:
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.depressio.SomeObject
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1215)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1148)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1154)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:678)
Теперь, конечно, он хорошо работает, если вместо удаления сущности, я просто обновите свои поля, которые изменились. Тем не менее, мне просто дают новый объект (пользовательский интерфейс бросает его мне через REST), поэтому я действительно не знаю, какие поля изменились, поэтому мне нужно будет обновить каждые. Если есть тонна полей, это не идеально.
Я думаю, что я немного запутался относительно того, как на самом деле правильно удалить. Я думал, что EntityManager.remove
был верным путем, но я думаю, нет.
Заранее благодарен!
Редактировать 1: Я чувствую, что должен отметить, что oldObject.id == newObject.id. id
генерируется через @SequenceGenerator
. Могу ли я сохранять объекты с идентификаторами, если их идентификатор уже аннотируется генератором?
Редактировать 2: В соответствии с верхним подтвержденным ответом here, поскольку @Id
уже определен, и это автоматически сгенерированное поле, Hibernate считает, что он отсоединен. Теперь я знаю почему Я получаю исключение, но решение все еще неясно.
О, боже, это смущает. По какой-то причине я предположил, что «слияние» работает только с прикрепленными объектами, а не с отдельными. Думаю, это может работать и для обоих, а? Во всяком случае, это решает проблему ... так глупо со мной. Благодаря! – Depressio
Объединение прикрепленного объекта ничего не делает, кроме каскадирования объединения в ассоциации, аннотированные каскадным MERGE или ALL. –
Что делать, если я модифицирую прикрепленный объект? Мне даже нужно объединиться, так как он прикреплен? У меня такое впечатление, что нет, не знаю. – Depressio