Это сценарий:
Между 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'
Есть ли способ заставить его снова работать?
Возможно, есть способ настроить вашего провайдера постоянства (Hibernate) так, чтобы он принял это странное положение дел, но даже если это так, я склонен думать, что было бы лучше как можно скорее погасить технический долг, свернувшийся в этом неуклюжем проекте. . Возможно, вы хотите использовать наследование сущностей. Возможно, вы хотите переключиться с представления на именованный запрос. Возможно, вы хотите чего-то другого. Но чем дольше вы ждете, чтобы исправить это, тем дороже это будет стоить, когда в конечном итоге вам придется это сделать.
Через пару дней я нашел решение, используя @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 таким образом. Я проведу дополнительные исследования по этому вопросу, но иногда вам нужно быстрое решение реальной проблемы, которая не может ждать.
Обратите внимание, что это всегда было неверно. То, что это сработало до того, как вы обновили программное обеспечение, было (не)счастливой случайностью.