Как установить идентификатор на отдельном прокси Hibernate без исключения LazyInitializationException? - PullRequest
2 голосов
/ 18 февраля 2011

Я использую объект, который имеет более 15 связанных объектов (родителей). В моем пользовательском интерфейсе мне нужны только идентификаторы этих объектов, поэтому мне не нужна функциональность Hibernate fetch , и я использую концепцию lazy proxy , чтобы избежать попадания в базу данных на одном из них. и иметь объекты с заполненными идентификаторами с другой.

Чтобы достичь этого, я должен использовать доступ к свойству вместо доступа к полю для всех родительских объектов:

@Id
@Access(AccessType.PROPERTY) // this helps to avoid database hit on get, but not on set!!!    
private Long id;

Пока все хорошо, я загружаю объект из базы данных (никаких дополнительных объединений не делается) и показываю его в веб-интерфейсе со всеми связями (самое большее, с простым вводом данных). Я не создаю клоны (объекты-значения) для пользовательского интерфейса, я использую отдельные объекты гибернации напрямую. Но когда я делаю какие-либо изменения в пользовательском интерфейсе (изменяем родительский объект), платформа вызывает setId () для связанных прокси-объектов и ... это приводит к инициализации этих прокси! Вот код из Hibernate BasicLazyInitializer, который делает это:

else if ( method.equals(setIdentifierMethod) ) {
        initialize(); // Here the db hit occurs!!
        setIdentifier( (Serializable) args[0] );
        return INVOKE_IMPLEMENTATION;
     }

и возникает исключение LazyInitializationException (конечно, в данный момент у меня нет сеанса!).

Итак, есть ли способ сделать это без создания объектов значений для всех сущностей, извлеченных из базы данных? Могу сказать, что я всегда использовал объекты данных в пользовательском интерфейсе напрямую, но все они были извлечены полностью (не прокси), и у меня не было таких проблем, как сейчас с этими прокси ...

Я действительно не понимаю, почему Hibernate делает инициализацию прокси при установке (но не при получении) поля @ID ...

Заранее спасибо!

...