Является ли удаление сущности из гибернационного набора изменений таким же простым, как вызов EntityManger.detach ()? - PullRequest
3 голосов
/ 16 февраля 2012

Фон

У меня есть система Java / Spring, где транзакции управляются вручную через пользовательский HandlerInterceptor. То есть:

  • в начале каждого запроса открывается транзакция (неудачной частью системы является то, что любой запрос может привести к записи в БД)
  • экземпляр EntityManager присоединяется к транзакции
  • менеджер сущностей используется для загрузки измененных сущностей. EntityManager отслеживает все изменения
  • в конце каждого запроса EntityManager сбрасывается и фиксируется

Да, это не идеально, но я не создал эту систему, и она достаточно проста, чтобы позволить нам работать в ее рамках - я не собираюсь менять ее без веской причины.

Я не привык к поведению фиксации всех отслеживаемых сущностей на флеше и поэтому делал что-то вроде:

//change entity
if(ovalValidator.isValid(entity))
  em.persist(entity);

Мне нужно исправить это, чтобы работать с моим новым пониманием, и переключение вышеупомянутого на это, кажется, работает:

//change entity
if(!ovalValidator.isValid(entity))
  em.detach(entity);

Мой вопрос

Насколько я понимаю, это просто удаляет объект из очереди очистки, даже если он помечен как грязный. Это правильно? Есть ли лучший способ достичь того, что я пытаюсь (не сохранять изменения в этой сущности)? Есть ли что-то, на что мне нужно обратить внимание, если я делаю это?

1 Ответ

1 голос
/ 16 февраля 2012

detache удаляет сущность из сеанса (changeTracking, lazyloading, ...) и делает то, что вы хотите. Вы также можете внедрить en interceptor, удалив грязную отметку недействительных объектов, но я думаю, что ваше решение будет работать также

...