Я нахожусь в процессе миграции существующего приложения с 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;