Если вы хотите, чтобы никакие изменения БД не были внесены в ваши объекты, вы просто отсоединяете их от своего Менеджера сущностей.
- Чтобы отделить объект от менеджера объекта во время транзакции, просто используйте метод detach.
- Если объект не управляется (то есть после завершения транзакции), что объект все равно не управляется, и вы можете изменить его без дополнительного кода.
выдержка из спецификации JPA 2.0, от того, как субъект получает отдельно:
удаленных результатов сущности из транзакции, если используются транзакций Scoped управляемого контейнер диспетчер объектов (см раздел 3.3); от откат транзакции (см. раздел 3.3.2); от удаление объекта из контекста сохранения; от очистки контекста постоянства ; от закрытия администратора объекта; или сериализация объекта или иным образом передавая объект по стоимости, например, в отдельное приложенными ния уровень, через удаленный интерфейс и т.д.
А потом, когда решите внести изменения БД, вам просто объединить отдельный объект: entityManager.merge(entity);
.
Что я думаю о том, что вы пропустили какой-то фон JPA, например, какие состояния сущности и какие операции с объектом entityManager. Я рекомендую либо искать некоторые учебники, либо читать некоторые главы из JPA spec (читайте главу 3.2 Жизненный цикл экземпляра объекта , около 5 страниц, и я гарантирую, что вы поймете много). Кроме того, если вы хотите, чтобы ваши операции MERGE были каскадом, есть также решение для этого в JPA. Для операций на EntityManager & хорошее введение в JPA: the official tutorial.
ОБНОВЛЕНИЕ Я попытаюсь описать вас в ближайшее время, что в этих учебниках важно найти.
Экземпляр сущности (т.е.e постоянный объект java) управляется, если он связан с контекстом постоянства (~ EntityManager). Если он управляется, то его изменения отслеживаются, что означает, что изменение экземпляра управляемого объекта будет синхронизироваться с БД. Изменения синхронизируются с БД, например. когда транзакция завершена или когда вы вызываете entityManager.flush()
(подробнее см. подраздел 3.2.4 «Синхронизация с базой данных»).
операция слияния - фактически операция, с которой вы оба обновляете и сохраняете экземпляр объекта E1. Он возвращает экземпляр управляемой сущности E2, в то время как переданный объект E1 остается не управляемым.
отдельностоящий объект на другой стороне не отслеживаются entityManager
, то есть EntityManager не будет видеть изменения, которые вы делаете, пока вы не сливаются объект.
Обе операции (есть также операция сохранения, которую я не обсуждал) - это ваш способ переключить состояние экземпляра объекта, управляемого < -> отсоединенным.
Актуально о вашем запросе о root & children: Если ничего не настроено, вызов merge()
или detach()
на ваш корень не повлияет на ваших детей. Но есть каскадная схема, которую вы можете использовать в JPA, так что, например, вызывающий entityManager.merge(root)
, будет также вызван на его дочерних элементах. Конечно, вам решать, какой каскад операции, а какой нет.
Я хочу сделать изменения в БД, я просто хочу контролировать, когда это произойдет, и к каким объектам. –
Обновлен мой ответ. Вам просто нужно переместить объекты между отключенным и управляемым состоянием. –
Спасибо! Один последний маленький вопрос: Какова область слияния и отсоединения? Скажем, у меня есть ряд «корневых объектов» с отношением OneToOne или OneToMany к некоторым другим объектам, которые могут быть разделены между корневыми объектами. Что происходит, когда я вызываю отсоединение и слияние на корневых объектах? Я вызываю методы только для корневых объектов или для всех дочерних объектов? –