#java #hibernate
#java #гибернация
Вопрос:
Вот сценарий:
- Один объект / объект загружается из базы данных с помощью гибернации.
- Перед повторным сохранением этого объекта в БД выполняются некоторые манипуляции с этим объектом
- Мне нужно состояние объекта таким, какое оно есть в БД, то есть до изменения исходного состояния объекта, поэтому я снова загружаю объект из базы данных в новый экземпляр объекта.
- Я использую второй загруженный объект (этот объект больше не взаимодействует с БД)
- Сначала загруженный объект (с шага 1) сохраняется в базе данных для обновления его состояния и генерируется это исключение:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:...
Я понимаю, что в одном сеансе гибернации можно использовать не более одного объекта объекта. Но мне нужен объект с шага 3. только для извлечения его текущего состояния из базы данных, поэтому hibernate не нужно каким-либо образом отслеживать его, он мне просто нужен как POJO. Есть ли какой-либо способ удалить его из сеанса / кэша или где бы то ни было, где этот экземпляр хранится в режиме гибернации?
Ответ №1:
Каждый EntityManager, он же PersistenceContext, он же HibernateSession, имеет свой собственный кеш. Просто создайте второй и снова загрузите объект из базы данных, не вмешиваясь в первый. Пока первый объект не синхронизировал изменения с базой данных, вы получите исходные значения. Просто убедитесь, что вы знаете, когда синхронизация (иначе слияние) происходит именно в вашем приложении.
Комментарии:
1. Это решило проблему, большое вам спасибо.