Как исправить org.hibernate.WrongClassException? - PullRequest
0 голосов
/ 08 октября 2019

Я разрабатываю простое веб-приложение с использованием 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 и сохранить связь между кафедрами и факультетами?

1 Ответ

0 голосов
/ 09 октября 2019

Кажется, на строку с id=85 ссылается Department, но ее формула дискриминатора не оценивается как "FACULTY".

Другими словами, у вас, вероятно, есть строка kpodr(id = 85, k_se <> 3) и другая строка kpodr(k_se = 4, k_pvu = 85), и именно это является причиной проблемы.

...