2013-05-31 3 views
5

Я использую 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 считает, что он отсоединен. Теперь я знаю почему Я получаю исключение, но решение все еще неясно.

ответ

4

Это то, что EntityManager.merge(). Передайте ему новую отдельную сущность, и она объединит свое состояние со старым, прикрепленным объектом. Отчужденный объект останется отдельным, а старый останется привязанным, но его состояние будет заменено состоянием нового, отдельного.

+0

О, боже, это смущает. По какой-то причине я предположил, что «слияние» работает только с прикрепленными объектами, а не с отдельными. Думаю, это может работать и для обоих, а? Во всяком случае, это решает проблему ... так глупо со мной. Благодаря! – Depressio

+0

Объединение прикрепленного объекта ничего не делает, кроме каскадирования объединения в ассоциации, аннотированные каскадным MERGE или ALL. –

+0

Что делать, если я модифицирую прикрепленный объект? Мне даже нужно объединиться, так как он прикреплен? У меня такое впечатление, что нет, не знаю. – Depressio

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