У меня есть резюме @Entity
с несколькими конкретными подклассами. Для простоты рассмотрим:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "classType", discriminatorType = DiscriminatorType.STRING)
public abstract class Parent {
...
}
@Entity
@DiscriminatorValue("child1")
public class Child1 extends Parent {
...
}
@Entity
@DiscriminatorValue("child2")
public class Child2 extends Parent {
...
}
Для загрузки класса у меня есть репозиторий, который загружает абстрактный Parent:
interface ParentRepository extends JpaRepository<Parent, Long> { ... }
Когда я загружаю объект, я, очевидно, возвращаюсь Parent
(во время загрузки я получаю только идентификатор без , не зная тип):
Parent parent = parentRepository.findById(1);
Но под ним, очевидно, находится конкретный тип, основанный на значении дискриминатора. Поэтому мне должно быть разрешено понижать parent
выше до Child1
или Child2
. И это обычно случай. Но при некоторых обстоятельствах, которые не кажутся детерминированными c я получаю ClassCastException
вместо:
java.lang.ClassCastException: class ...Parent$HibernateProxy$MZu3Zm6v cannot be cast to class ...Child1 (...Parent$HibernateProxy$MZu3Zm6v and ...Child1 are in unnamed module of loader 'app')
Мне кажется, что иногда hibernate решает дать мне прокси вместо реального класса и потому что findById
запрашивает Parent
, он дает мне прокси для типа Parent
, хотя под капотом есть настоящий конкретный класс. Таким образом, мой конкретный вопрос, основанный на вышеизложенном, будет:
Как hibernate решает, что иногда возвращает конкретный тип (и пониженный работает, как ожидалось), а иногда я вернуть HibernateProxy
за Parent
? Это связано с тем, что объект уже присутствовал в PersistentContext
во время загрузки?
Как Hibernate определяет базовый тип для HibernateProxy
? Почему он не может сделать это прокси конкретного типа?