Почему, в спящем режиме, возвращая объект прокси?

У меня есть сервисный метод, который называет ДАО, который затем возвращает объект из базы данных. Этот метод называют от многочисленных частей системы. Однако один конкретный метод получает тип возврата $$ ObjectClass_ _javassist_somenumber как тип. Который отбрасывает вещи. Я еще называю сервисный метод точно тем же как везде, итак, почему был бы в спящем режиме, возвращают прокси в противоположность естественному объекту?

Я знаю, что существуют способы выставить "проксированный" объект, но я не чувствую, что мне придется сделать это.

Запрос просто

hibernateTemplate.find("from User u where u.username = ?", username)

Я использую, в спящем режиме 3.3 btw.

6
задан 7 April 2010 в 18:19
поделиться

2 ответа

Это прокси-объект для поддержки отложенной загрузки; в основном, как только вы ссылаетесь на дочерний объект или объект поиска с помощью методов доступа / получения, если связанная сущность не находится в кеше сеанса, тогда прокси-код уходит в базу данных и загружает связанный объект. Он использует javassist для эффективного динамического создания подклассов реализаций ваших объектов (хотя я думаю, что его также можно настроить для использования CGLIB ).

Если бы не проксирование таким образом, было бы практически невозможно реализовать бесшовную ленивую загрузку.

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

Кроме того, если вам нужно различать тип класса, а не использовать obj.getClass () , используйте Hibernate.getClass (obj) , который вернет вам естественный класс объекта, независимо от того, проксируется он или нет: см. документацию по API Hibernate здесь .

9
ответ дан 9 December 2019 в 20:41
поделиться

Hibernate возвращает прокси, если не все члены разрешены, т.е. объект не является полным. Это часто является желаемой функцией для повышения производительности и (я думаю) является настройкой по умолчанию в hibernate.

Если вам не нужны прокси, вы можете подавить ленивую загрузку в файле hbm.xml, т.е. использовать нетерпеливую загрузку. Точный синтаксис смотрите в документации hibernate.

Чтобы использовать прокси-объект, просто никогда не обращайтесь к члену напрямую, а только через getter, даже внутри функций-членов. Магия Hibernate заполнит член, когда вы его получите. Таким образом, вам никогда не придется раскрывать объект. Также не используйте instanceof для потенциальных прокси-объектов. Но в любом случае это запах кода.

1
ответ дан 9 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: