Если я понимаю ваш вопрос, вы извлекаете объект A с ленивой ассоциацией к B. Однако эта ассоциация не инициализируется, и вы обнаруживаете, что другие модули выдают исключения, потому что B фактически используется. Так что требуется каким-то образом.
Вы хотите либо
Возврат null
из вызовов на B
(насколько я знаю, это невозможно, если только в этих модулях не наблюдается какое-то специфическое поведение приложения) или
Инициализировать B
, когда такие вызовы происходят. Я постараюсь помочь вам реализовать это.
Причина, по которой вы получаете LazyInitializationExceptions
, заключается в том, что сеанс, который извлек B
(и не инициализировал его), уже закрыт, поэтому на данный момент экземпляр B
бесполезен совсем. Один из способов обойти это здесь - использовать шаблон OSIV , чтобы у вас был один и тот же сеанс Hibernate, открытый во всей области запроса. Это сеанс, который будет извлекать A
с ленивым B
и инициализирует B
, когда возникнет необходимость .
Другой вариант, который вы могли бы применить, - инициализация B
в другом сеансе (допустимо только в том случае, если эти исключения происходят в контексте другой транзакции, то есть с другим открытым сеансом Hibernate, отличным от того, который был извлечен * 1033). *). Например:
session.update(a.getB());
Конечно, вы всегда можете принудительно инициализировать B
с помощью fetchMode.EAGER
или Hibernate.initialize(a.getB())
. Но это будет безоговорочно загружать экземпляр, даже если он вообще не будет использоваться.
Также могут оказаться полезными ответы на этот вопрос: hibernate: LazyInitializationException: не удалось инициализировать прокси