Как Hibernate определяет тип для прокси-объекта - PullRequest
1 голос
/ 11 марта 2020

У меня есть резюме @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, хотя под капотом есть настоящий конкретный класс. Таким образом, мой конкретный вопрос, основанный на вышеизложенном, будет:

  1. Как hibernate решает, что иногда возвращает конкретный тип (и пониженный работает, как ожидалось), а иногда я вернуть HibernateProxy за Parent? Это связано с тем, что объект уже присутствовал в PersistentContext во время загрузки?

  2. Как Hibernate определяет базовый тип для HibernateProxy? Почему он не может сделать это прокси конкретного типа?

...