Есть ли у 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 может нормально обрабатывать непроксированные объекты, но он может вызвать загрузку объекта, если вы отключите прокси еще не инициализированный объект (например, дочерний объект, который был загружен лениво).

Другие вопросы по тегам