2014-11-10 7 views
1

Я использую JPA (с Hibernate как поставщик JPA). У меня есть операция, чтобы удалить объект, и, кажется, что если я отделить объект и сразу же слить его исключение выбрасывается, т.е.Откат JPA и немедленное слияние вызывает ошибки

em.find(entity.class, entitiy.getId()) 
em.detach(entity) 
em.merge(entity) 

будет вызывать ошибки при просто

em.find(entity.class, entitiy.getId()) 

Пройдут безотказно , Есть ли что-то, что мне не хватает в отделении и слиянии? Я ничего не делал в самом сущности, это не было изменением, поэтому слияние не должно ничего менять.

При необходимости я могу подробнее рассказать о своем конкретном случае.

EDIT

Как @rmertins указывал, я должен использовать возвращаемое значение из слияния, как слияние возвращает объект слияния в то время как объект мы использовали в качестве параметра остается отдельно. Это работает:

em.find(entity.class, entitiy.getId()) 
em.detach(entity) 
entity = em.merge(entity) 
+3

ошибки? заботиться о том, чтобы дать людям ключ, как исключение? –

+0

Является ли класс или объект 'entity'? – Yubaraj

+0

EntityNotFoundException для другого объекта, который был удален (до вызова em.find(), все еще в той же транзакции). Я сказал, что при необходимости создам больше :) Entity - это объект, entity.class должен быть Entity.class). – apines

ответ

1

Извините, что я виноват, было быстро.

Посмотрите здесь, очень хорошее объяснение:

http://blog.xebia.com/2009/03/23/jpa-implementation-patterns-saving-detached-entities/

Вот фраза, что имеет значение:

Это означает, что после вызова EntityManager.merge, мы должны использовать ссылку лица возвращенный из этого метода вместо исходного переданного объекта.

Итак, подсказка заключается в том, что после слияния объект объекта все еще отсоединяется, но результирующая копия объекта из слияния снова привязывается к контексту персистентности.

+0

Вот и все! Не могу поверить, что я не пробовал этот, пропустил возвращаемое значение merge(), спасибо! – apines

+0

Добро пожаловать –

2

Разве что вы все еще используете старую ссылку на объект вместо той, которая возвращается слиянием?

The merge operation doesn't reattach the given entity. Операция слияния ищет уже загруженный объект и, поскольку он не может его найти (поскольку вы его отделили), он загружает объект из базы данных и копирует данные предоставленной сущности в новую копию из базы данных.

Если вы что-то вроде этого:

MyEntity myEntity = em.find(MyEntity.class, myEntity.getId()) 
em.detach(myEntity); 
em.merge(myEntity); 

Тогда вы просто отбрасывать фактическое объединенное юридическое лицо, потому что вы не переназначить MyEntity в результате слияния. Вы должны сделать это вместо того, чтобы:

myEntity = em.merge(myEntity); 

Теперь MyEntity будет ссылаться на прилагаемый объекте (объект загружен в 1 Cache Level a.k.a Persistence контекста).

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

  • Нет связанных вопросов^_^