Что на самом деле делает adminService.getA(request.getParameter("id"));
?Если он делает что-то вроде:
hibernateSession.get (A.class, id);
, тогда Hibernate извлечет соответствующие значения из строки с этим идентификатором и создаст экземпляр классаА вы передали в качестве аргумента (вот почему вы передаете его от javadocs: «Вернуть постоянный экземпляр данного класса сущностей с заданным идентификатором»).Это означает, что даже если вы объявили свое наследование Hibernate таким образом, что Entity C расширяет Entity B, расширяет Entity A, а соответствующие классы расширяют друг друга таким же образом, Hibernate фактически создаст экземпляр A (не экземпляр B или C).который вы называете как A), так что экземпляр A не может быть приведен к B.
Если, однако, идентификатор соответствует строке, которая имеет тип B (скажем так), то если вы выполните
A a = hibernateSession.get(B.class,id);
тогда вы можете сделать
B b = (B)a;
, потому что ваш объект "a" является типом B (даже если вы изначально рассматривали его как A).Однако в этой ситуации было бы проще сделать:
B b = hibernateSession.get(B.class,id);
Опять же, вышеприведенное сработает, если вы на самом деле сохранили сущность типа B (или C) в строке с этим идентификатором (т.е. ваш дискриминатор)столбец содержит значение для типа B или C)