Как решить проблему отложенной загрузки JPA с instanceof - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть эти jpa Entities

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
class AbstarctAddress {


}

@Entity
public class ConsolidationHub extends AbstarctAddress {

}


@Entity
class Transport {

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "delivery_address_id")
   private AbstarctAddress address;

}

, когда я делаю

select t from Transport t left join fetch t.address

, а затем instanceof проверяем вот так

t.getAddress () instanceOf ConsolidationHub itвозвращает false.Это потому что я получил Hibernate прокси.когда я перехожу на EAGER, у меня нет этой проблемы.но я не хочу ставить EAGER, так как у меня проблемы с производительностью EAGER.

Знаете ли вы, как можно решить эту проблему?

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

1 Ответ

0 голосов
/ 02 января 2019

Боюсь, ответ таков: начните писать код ООП.instanceof летит перед лицом полиморфизма.Клиенты класса не должны никогда заботиться о том, к какому конкретному подтипу / реализации они обращаются.

Если вы использовали наследование сущностей и теперь должны использовать instanceof в своем коде, ваш дизайн, скорее всего, ошибочен.Hibernate во многих случаях использует прокси, и вы не можете полагаться на instanceof или .getClass(), всегда возвращающие точный класс вашей сущности.

Если, с другой стороны, вы использовали instanceof из любопытства и были удивлены, обнаружив, что он действительно возвращает false, не бойтесь, все вызовы, которые вы делаете этому прокси-серверу сущности, по-прежнемуполиморфный.

Причина сбоя instanceof заключается в том, что Hibernate должен инициализировать свойство lazy с что-то , и он не может определить тип этого что-то до свойствазагружен.Если вы настаиваете на использовании instanceof, вы можете попробовать включить улучшение сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...