Hibernate: безопасно подключите объект к сеансу - PullRequest
9 голосов
/ 28 апреля 2010

Я поддерживаю кэш объектов в сеансах гибернации, сохраняя (возможно, отдельные) объекты на карте. Когда кэш получает удар, я проверяю, является ли объект уже частью сеанса с Session.contains(object). Если нет, я повторно присоединяю его с Session.lock(object, LockMode.NONE).

Проблема в том, что если тот же объект был загружен ранее в сеансе, он генерирует исключение org.hibernate.NonUniqueObjectException. При наличии отдельного экземпляра я не вижу возможности заранее узнать, будет ли выброшено это исключение, не ударив по базе данных.

Есть несколько обходных путей:

  1. Повторно подключите все кэшированные объекты в начале каждой транзакции.
  2. Перехватите исключение NonUniqueObjectException и затем вызовите session.load (object.class, object.getId ());

Ни один из них не так чист, как предварительная проверка сеанса для класса объекта + id.

Есть ли способ сделать это?

Ответы [ 2 ]

4 голосов
/ 28 апреля 2010

Session.merge () должен сделать это:

obj = session.merge(obj);
0 голосов
/ 28 апреля 2010

Я поддерживаю кэш объектов в сеансах гибернации

Не прямой ответ, но почему бы вам не использовать для этого кеш Hibernate L2, а не изобретать велосипед?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...