Невозможно использовать ассоциации в представлении после обновления Hibernate

Это сценарий:

Между EntityA и EntityB существует связь «один ко многим»:

@Entity
@Table(name = "EntityA")
class EntityA {
    @Id
    Long idEntityA;
    
    @OneToMany(mappedBy = "entityA", fetch = FetchType.LAZY)
    Set<EntityB> entitiesB;
}

@Entity
@Table(name = "EntityB")
class EntityB {
    @Id
    Long idEntityB;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "idEntityA")
    private EntityA entityA;
}

Существует также представление базы данных, содержащее подмножество записей EntityA. Он имеет собственное представление сущности:

@Entity
@Table(name = "V_EntityA")
class ViewEntityA {
    @Id
    Long idEntityA;

    @OneToMany(mappedBy = "entityA", fetch = FetchType.LAZY)
    Set<EntityB> entitiesB;
}

Мне удавалось без проблем использовать ассоциацию ViewEntityA.entitiesB до обновления до SpringBoot3 и Hibernate 6.

Теперь, если я попытаюсь получить доступ к любому ViewEntityA.entitiesB, я получу эту ошибку:

Ассоциация «mypackage.ViewEntityA.entitiesB» — это 'mappedBy' - свойство с именем 'entityA', которое ссылается на неверную ссылку. ожидается тип объекта «mypackage.EntityA». 'мойпакет.ViewEntityA'

Есть ли способ заставить его снова работать?

Обратите внимание, что это всегда было неверно. То, что это сработало до того, как вы обновили программное обеспечение, было (не)счастливой случайностью.

John Bollinger 15.04.2024 23:31

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

John Bollinger 15.04.2024 23:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Через пару дней я нашел решение, используя @JoinColumn:

@Entity
@Table(name = "V_EntityA")
class ViewEntityA {
    @Id
    Long idEntityA;

    @OneToMany
    @JoinColumn(name = "idEntityA", referencedColumnName = "idEntityA")
    Set<EntityB> entitiesB;
}

Благодаря этому Hibernate смог создать правильные SQL-запросы и получить коллекцию EntityB, отфильтрованную по idEntityA.

P.S.: Я понимаю, что это может быть не лучшее решение. Я даже не знаю, следует ли использовать @JoinColumn таким образом. Я проведу дополнительные исследования по этому вопросу, но иногда вам нужно быстрое решение реальной проблемы, которая не может ждать.

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