hibernate annotations polymorphism hibernate-4.x

Hibernate 4 polimorfismo explícito(anotación) no funciona?



annotations polymorphism (2)

Estoy enfrentando un problema con el polimorfismo explícito de Hibernate. Utilicé la anotación de polimorfismo y la configuré como explícita, pero con get () y las colecciones en las clases mapeadas siempre obtengo todas las subclases. Veo todas las subclases con la combinación izquierda en la salida de hibernación "show_sql". ¿Cuál es el problema? ¿Entiendo que la documentación es incorrecta? ¿O es un error en hibernate 4? No he visto ningún ejemplo con hibernate 4 y anotación de polimorfismo.

sessionFactory.getCurrentSession().get(Node.class, 111); // return subclasses! @Entity @Table(name="Nodes") @Inheritance(strategy = InheritanceType.JOINED) @Polymorphism(type= PolymorphismType.EXPLICIT) public class Node implements Serializable { ... } @Entity @Table(name="Persons") public class Person extends Node { } @Entity @Table(name="Networks") public class Network extends Node { } ...and other subclasses...


Es un error común entender, yo también tuve la misma duda una vez ..

Esto es lo que realmente sucede en el polimorfismo explícito.

el polimorfismo explícito solo se aplica a las entidades raíz y evita que las consultas den nombre a una superclase (no asignada) para devolver subunidades mapeadas

En su caso, si los Nodos de Clase de la Entidad no fueron mapeados y las Personas tenían polimorfismo explícito, entonces los Nodos no devolverían elementos de Personas .

Mira este código ...

@Entity @Table(name="Nodes") @Inheritance(strategy = InheritanceType.JOINED) public class Node implements Serializable { ... } @Entity @Polymorphism(type= PolymorphismType.EXPLICIT) @Table(name="Persons") public class Person extends Node { } @Entity @Polymorphism(type= PolymorphismType.EXPLICIT) @Table(name="Networks") public class Network extends Node { }

Es básicamente lo contrario de lo que todos tienen en mente.


Si observas la definición de PolymorphismType.EXPLICIT dice:

EXPLÍCITO: esta entidad se recupera solo si se le solicita explícitamente.

Para ocultar las subclases, deberá anotar las subclases con EXPLICIT y no con la clase base.