Заставить метод быть нетранзакционным в JPA (Eclipselink) - PullRequest
2 голосов
/ 10 мая 2010

Я занимаюсь разработкой приложения с использованием Eclipselink, и как часть приложения мне нужно иметь возможность манипулировать некоторыми объектами, которые включают изменение данных без их сохранения в базе данных (я объединяю / изменяю объекты для некоторых процессов генерации пакетов) ,

Я неохотно изменяю данные в объектах Entity, поскольку существует риск того, что, хотя я не пометил методы как @Transactional, в будущем этот метод может быть вызван непреднамеренно изнутри транзакционного метода, и они изменения могут быть сохранены.

Итак, мой вопрос, есть ли способ обойти это? Например, заставить метод всегда быть нетранзакционным; прекратить любую транзакцию, как только метод запущен; и т.д.

Я знаю, что есть метод .detach (), который может отсоединять объекты от Entity Manager, однако есть много объектов, и это кажется потенциально подверженным ошибкам отказоустойчивым в моем коде.

Ответы [ 2 ]

4 голосов
/ 11 мая 2010

Если это пружина , у вас есть

@Transactional(propagation=Propagation.NOT_SUPPORTED)

Выполнить без транзакций, приостановить текущую транзакцию, если она существует. Аналог атрибута транзакции EJB с тем же именем.

Если это EJB, у вас есть атрибут транзакции с тем же именем.


В любом случае, вместо того, чтобы играть с транзакциями, вы можете просто клонировать свой объект и изменить необходимые данные. Глубокое клонирование может быть достигнуто через общий язык SerializationUtils.

1 голос
/ 11 мая 2010

Я не уверен, что понимаю ваш вариант использования, но я бы не стал связываться с транзакцией здесь, а также:

  • Не merge изменения, внесенные в сущности ~ или ~
  • refresh любые изменения, внесенные в сущности до merge (но зачем вам звонить merge?) ~ Или ~
  • Работа с неуправляемыми копиями сущностей ~ или ~
  • Объявление некоторых классов только для чтения (EclipseLink специфично, см. Объявление классов только для чтения и Как использовать аннотацию @ReadOnly ). Из документа:

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

...