2016-06-01 3 views
1

Используя Hibernate, я получаю List<BlablaPO> (BlablaPO) Blabla). Когда я сделать что-то вроде этого:Отражение - getInterfaces() показывает странные интерфейсы

for(Blabla blabla : list) { 
    Class<?>[] interfazes = blabla.getClass().getInterfaces(); 
} 

Этот код является лишь частью кусок кода, который принимает Collection<T>. Сегодня я использовал этот код еще раз на новом List<Blabla>, мои возвращаемые интерфейсы не не имеют BlaBla в них, вместо этого я получаю 2 интерфейса:

  • интерфейс org.hibernate.proxy.HibernateProxy
  • интерфейс javassist.util.proxy.ProxyObject

Am I загрузки сбор неверно? Я пробовал загружать коллекцию с нетерпением.

EDIT: Я довольно уверен, что проблема в том, что у меня есть моя коллекция, загруженная лениво.

+0

'blabla.getClass()' является проблемой, ('blabla' не' new BlablaPO() '), попробуйте' org.hibernate.proxy.HibernateProxyHelper # getClassWithoutInitializingProxy (blabl a) .getInterfaces() '. –

+0

Это не проблема. В случае, если BlablaPO реализует Blabla, тогда blabla - BlablaPO. Проблема в том, что я лениво загрузил все. –

+0

blabla - это BlablaPO, но не совсем новый BlablaPO(), в данном случае. –

ответ

1

Это происходит потому, что Hibernate заменяет ваши экземпляры сгенерированными классами прокси для ваших собственных классов. Например, боб, как:

class Foo implements SomeInterface { 
    @OneToMany 
    public List<MyBean> getBar() { ... } 
} 

будет подклассы по Hibernate аналогично следующему классу:

class Foo$Hibernate extends Foo implements HibernateProxy, ProxyObject { 
    @Override 
    public String getBar() { Hibernate.loadFromDBOnDemand(); } 
} 

Когда вы просите для интерфейсов Foo$Hibernate, вы не сможете увидеть SomeInterface, вы должны сначала перейти на SomeInterface. Однако условие foo instanceOf SomeInterface будет продолжать удерживаться и может быть тем, за что вы хотите пойти.

+0

Итак, что можно сделать для решения этой проблемы? Не должны ли отображаться интерфейсы суперкласса? –

+0

Вам необходимо выполнить итерацию иерархии классов. Вы можете проверить класс для реализации HibernateProxy, и в этом случае вместо проверки самого класса вы проверяете суперкласс для интерфейса. –

+0

Это правда, но на более позднем этапе все мои значения моего объекта будут пустыми, так как я получил его лениво загружен. –

0

Моя проблема в том, что я загрузил все лениво. Решение состояло в том, чтобы загрузить все правильно, что привело к тому, что код работал на 100% отлично :).

+0

Загрузка лениво не загружается неправильно. Это поведение по умолчанию, а иногда и более желательно, чем интенсивная загрузка. –

+0

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

Смежные вопросы