Есть ли у Hibernate.unproxy побочные эффекты?
В нашем проекте у нас есть часть кода, которая выполняет действия в зависимости от класса переданного объекта. Что-то вроде этого:
public class A { }
public class B extends A { }
public class Manager {
public void manageA(A obj) {
if(A.class.equals(obj.getClass()) {
//do stuff
} else if(B.class.equals(obj.getClass()) {
//do other stuff
}
}
}
Теперь A и B являются объектами Hibernate. Иногда случается, что метод manageA получает прокси-объект и не может делать то, как он реализован. Итак, мы добавилиHibernate.unproxy
чтобы получить объект без проксирования.
public void manageA(A obj) {
obj = (A) Hibernate.unproxy(obj);
if(A.class.equals(obj.getClass()) {
//do stuff
} else if(B.class.equals(obj.getClass()) {
//do other stuff
}
}
Но я боялся, что это может иметь некоторые побочные эффекты, то есть то, что может работать с прокси-объектом, больше не работает. При отладке я заметил, что при отмене проксирования объекта я теряю атрибут "обработчик" (который принадлежит Hibernate), но я не знаю, что он делает, или обрабатывает ли Hibernate свои вещи другими способами.
Я знаю, что могу просто сделать это
public void manageA(A obj) {
Class<? extends A> clazz = (A) Hibernate.unproxy(obj).getClass();
if(A.class.equals(clazz) {
//do stuff
} else if(B.class.equals(clazz) {
//do other stuff
}
}
оставив проксируемый объект нетронутым. Но я думаю, есть ли у распаковки объекта Hibernate какие-то побочные эффекты, об этом стоит знать на будущее.
Стоит упомянуть, что я не боюсь того, что происходит вне метода, а того, что может произойти внутри самого метода (допустим, он вызывает сохранение или обновление из репозитория Spring Data JPA, и что-то, что может работать с прокси-объектом, не работает с объект без прокси)
1 ответ
Я широко использовал свой код с Hibernate.unproxy с тех пор, как опубликовал этот вопрос, и у меня не было никаких проблем.
Как сказано в комментариях, Hibernate может нормально обрабатывать непроксированные объекты, но он может вызвать загрузку объекта, если вы отключите прокси еще не инициализированный объект (например, дочерний объект, который был загружен лениво).