#hibernate #lazy-initialization
#впасть в спящий режим #ленивая инициализация
Вопрос:
Допустим, в режиме гибернации у вас есть класс с именем department, и он содержит список сотрудников. Есть ли способ проверить список сотрудников, чтобы определить, был ли он уже введен в действие? Кажется, независимо от того, к какому свойству вы обращаетесь, оно выдает вам исключение ленивого инициализатора. Есть ли какой-либо способ проверить его инициализацию без получения исключения?
Я хотел бы посмотреть, был ли он инициализирован, и если нет, просто выполните запрос данных и заполните его.
Ответ №1:
Есть ли способ проверить список сотрудников, чтобы определить, был ли он уже инициализирован?
Вы могли бы использовать гибернацию.IsInitialized(), чтобы проверить, инициализирован ли объект гибернации или нет.
Я хотел бы посмотреть, был ли он инициализирован, и если нет, просто выполните запрос для данных и заполните его.
Вы можете использовать Hibernate.initialize() для принудительной инициализации объекта гибернации. Он будет запрашивать и заполнять данные для вас, если они еще не инициализированы.
Ответ №2:
вам не нужно выполнять запрос вручную — весь смысл отложенной инициализации заключается в том, что ORM обработает его за вас, когда придет время для доступа к данным.
Если вы получаете исключение отложенной инициализации, это означает, что сеанс гибернации не открыт, поэтому он не может извлекать дочерние элементы.
Используйте open-session-in-view (который сохраняет сеанс открытым в течение срока действия запроса в веб-приложении) или инициализируйте коллекцию заранее при загрузке родительского элемента (что приводит к накладным расходам на загрузку данных, которые могут не понадобиться, что нормально, если его всегдатребуется).
Комментарии:
1. Я понимаю значение исключения отложенной инициализации. ORM неправильно обрабатывает данные, потому что он не уведомляет вас о своем состоянии. То, что он «должен» делать, в значительной степени не имеет значения, потому что это автоматическое волшебство не работает. Итак, мне было интересно, сделал ли это способ проверки его состояния доступным для вас.
2. Это просто какой-то ботаник. Меня просто раздражал спящий режим. Не беспокойтесь об этом.