Причина
Возможно, вы получаете сообщение об ошибке при попытке получить доступ к свойствам экземпляров класса MyDocument
, возвращаемых запросом.
Hibernate lazy по умолчанию.Он возвращает вам proxy
для объекта вместо попадания в базу данных при каждом обращении к ссылочному свойству.Это поведение может быть перезаписано при необходимости.Всегда помните, что не удалось инициализировать прокси-сервер - сеанс не получен, когда код пытается получить доступ к свойствам proxy
(путем нажатия на базу данных) и обнаруживает, что сеанс недоступен (сеанс необходим, поскольку Hibernate обращается к базе данных с использованием этого интерфейса)
Решение
Убедитесь, что ваш сеанс открыт всякий раз, когда Hibernate пытается загрузить объект, который еще не был загружен.Как ты это делаешь?
(Простыми словами) В Hibernate есть две школы мысли:
- Извлеките все данные, к которым вы можете получить доступ, прежде чем закрыть Сессию ИЛИ
- keepСессия открыта на все время работы с объектами.
Мне бы хотелось, чтобы вы освежили такие темы, как единица работы в Hibernate.Hibernate предоставляет замечательный интерфейс для определения границ доступа к базе данных.Данные должны быть доступны (чтение / запись) между этими границами. Проверьте здесь
hibernate.current_session_context_class
в конфигурации гибернации, которая может принимать значения jta |нить |удалось |custom.Class.Эта переменная определяет единицу работы для Session
.
Последнее, но самое главное, попробуйте использовать Контекстные сеансы (вы, должно быть, натолкнулись на .getCurrentSession()
, который поможет вам получить тот же сеанс, который всегда открыт в любом месте вашего кода . Hibernate обрабатывает все за кадром.
Надеюсь, этот ответ послужит вам руководством для выбора правильного пути использования Hibernate, а непросто решить эту конкретную проблему.