Я поддерживаю кэш объектов в сеансах гибернации, сохраняя (возможно, отдельные) объекты на карте. Когда кэш получает удар, я проверяю, является ли объект уже частью сеанса с Session.contains(object)
. Если нет, я повторно присоединяю его с Session.lock(object, LockMode.NONE)
.
Проблема в том, что если тот же объект был загружен ранее в сеансе, он генерирует исключение org.hibernate.NonUniqueObjectException. При наличии отдельного экземпляра я не вижу возможности заранее узнать, будет ли выброшено это исключение, не ударив по базе данных.
Есть несколько обходных путей:
- Повторно подключите все кэшированные объекты в начале каждой транзакции.
- Перехватите исключение NonUniqueObjectException и затем вызовите session.load (object.class, object.getId ());
Ни один из них не так чист, как предварительная проверка сеанса для класса объекта + id.
Есть ли способ сделать это?