Я разрабатываю простое веб-приложение с использованием Spring Boot. Я отобразил несколько объектов из иерархии наследования в одну ранее существующую таблицу. Вот мой базовый класс:
@Entity
@Table(name = "kpodr")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula("CASE WHEN k_se = 3 THEN 'FACULTY' WHEN k_se = 4 THEN 'DEPARTMENT' ELSE 'COMMON' END")
@DiscriminatorValue("COMMON")
public class Unit {
@Id
@Column(name = "k_podr")
protected long id;
...
}
И дочерние классы:
@Entity
@DiscriminatorValue("FACULTY")
public class Faculty extends Unit {
...
}
@Entity
@DiscriminatorValue("DEPARTMENT")
public class Department extends Unit {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "k_pvu")
private Faculty faculty;
...
}
Все отлично работает, и я могу получить любые данные, которые мне нужны, даже Faculty
, которому принадлежит Department
. Но теперь мне нужно использовать базовый тип Unit
для сопоставления другой сущности:
@Entity
@Table(name = "mesto_rab")
public class Workplace {
@Id
@Column(name = "id")
private long id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "k_podr")
private Unit unit;
...
}
Когда я пытаюсь получить рабочие места, я получаю org.hibernate.WrongClassException: Object [id=85] was not of the specified subclass [workload.faculty.Faculty] : loaded object was of wrong class class workload.unit.Unit
.
Я нашел точное место в своем кодечто приводит к этому исключению. Если я уберу связь между Department
и Faculty
, то все будет работать так, как ожидается.
@Entity
@DiscriminatorValue("DEPARTMENT")
public class Department extends Unit {
@ManyToOne(fetch = FetchType.EAGER) <====|
@JoinColumn(name = "k_pvu") <====| Remove this
private Faculty faculty; <====|
...
}
Как исправить org.hibernate.WrongClassException
и сохранить связь между кафедрами и факультетами?