JOIN FETCH для свойства подтипа сущности больше не работает после обновления Hibernate с 5.1 до 5.3 - PullRequest
0 голосов
/ 12 июня 2019

Я нахожусь в процессе миграции существующего приложения с JBoss EAP7.1 на 7.2.

Это подразумевает обновление Hibernate 5.1.16.Final до 5.3.7.Final и JPA 2.1 до 2.2.

Этот результат в именованном запросе больше не работает.

У нас есть двунаправленная связь между измерением (один) и коррекцией (многими) (многие).

Измерение имеет одну таблицу наследования со столбцом дискриминатора и двумя подтипами (MeasurementA и MeasurementB). Атрибут исправления и соответствующий ему атрибут @OneToMany содержатся в подтипах. Оба называются «исправления». Их атрибут mappedBy ссылается на каждый из атрибутов на стороне коррекции (см. Ниже).

Коррекция имеет два свойства измерения, помеченных @ManyToOne. Функционально они относятся к MeasurementA и MeasurementB, но это не применяется (так как они оба относятся к измерениям супертипа). Кроме того, у нас есть именованный запрос, который делает это:

SELECT m FROM Measurement m LEFT JOIN FETCH m.corrections WHERE m.id = :id

Раньше это работало в оригинальной версии, но теперь приводит к

org.hibernate.QueryException: не удалось разрешить исправления свойств.

Это понятно, так как это свойство не существует в родительском классе. Хотя это может быть неуклюжим способом разработки отношения, он работал в предыдущей версии, и я хотел бы, чтобы запрос работал без изменения структуры базы данных.

* * Измерение тысячи двадцать-одиной: * * тысяча двадцать-дв
@Entity
@Table(name = "MEASUREMENT")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "qualifier", discriminatorType = DiscriminatorType.STRING)
public abstract class Measurement
 public abstract Set<Correction> getCorrections();

MeasurementA:

@Entity
@DiscriminatorValue("A")
public class MeasurementA extends Measurement {
    @OneToMany(mappedBy = "measurementA", cascade = CascadeType.ALL)
    private Set<Correction> corrections = new HashSet<>();

MeasurementB:

@Entity
@DiscriminatorValue("B")
public class MeasurementB extends Measurement {
    @OneToMany(mappedBy = "measurementB", cascade = CascadeType.ALL)
    private Set<Correction> corrections = new HashSet<>();

Исправление:

@Entity
@Table(name = "CORRECTION")
public class Correction
    @ManyToOne
    private Measurement measurementA;

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