У меня есть сервисный метод, который называет ДАО, который затем возвращает объект из базы данных. Этот метод называют от многочисленных частей системы. Однако один конкретный метод получает тип возврата $$ ObjectClass_ _javassist_somenumber как тип. Который отбрасывает вещи. Я еще называю сервисный метод точно тем же как везде, итак, почему был бы в спящем режиме, возвращают прокси в противоположность естественному объекту?
Я знаю, что существуют способы выставить "проксированный" объект, но я не чувствую, что мне придется сделать это.
Запрос просто
hibernateTemplate.find("from User u where u.username = ?", username)
Я использую, в спящем режиме 3.3 btw.
Это прокси-объект для поддержки отложенной загрузки; в основном, как только вы ссылаетесь на дочерний объект или объект поиска с помощью методов доступа / получения, если связанная сущность не находится в кеше сеанса, тогда прокси-код уходит в базу данных и загружает связанный объект. Он использует javassist для эффективного динамического создания подклассов реализаций ваших объектов (хотя я думаю, что его также можно настроить для использования CGLIB ).
Если бы не проксирование таким образом, было бы практически невозможно реализовать бесшовную ленивую загрузку.
Я не могу припомнить, если вы используете активную загрузку, то будет ли вместо нее возвращен естественный объект. Я бы обычно не рекомендовал использовать нетерпеливую загрузку, особенно если у вас много связанных дочерних объектов, так как вскоре это может стать огромным узким местом в производительности, поскольку он будет втягивать каждый связанный объект в память.
Кроме того, если вам нужно различать тип класса, а не использовать obj.getClass ()
, используйте Hibernate.getClass (obj)
, который вернет вам естественный класс объекта, независимо от того, проксируется он или нет: см. документацию по API Hibernate здесь .
Hibernate возвращает прокси, если не все члены разрешены, т.е. объект не является полным. Это часто является желаемой функцией для повышения производительности и (я думаю) является настройкой по умолчанию в hibernate.
Если вам не нужны прокси, вы можете подавить ленивую загрузку в файле hbm.xml, т.е. использовать нетерпеливую загрузку. Точный синтаксис смотрите в документации hibernate.
Чтобы использовать прокси-объект, просто никогда не обращайтесь к члену напрямую, а только через getter, даже внутри функций-членов. Магия Hibernate заполнит член, когда вы его получите. Таким образом, вам никогда не придется раскрывать объект. Также не используйте instanceof для потенциальных прокси-объектов. Но в любом случае это запах кода.