2011-11-30 16 views
6

Estoy usando la anotación Hibernate para persistir en mis clases. Actualmente estoy usando la siguiente estrategia para mapear las clasesHibernate Polimórfico HQL instrucción SELECT

Tengo una clase abstracta que es la clase Parent, y tengo dos subclases que heredan de ella Mother, Father.

Me asignan de esa manera:

@MappedSuperclass 
public abstract class Parent { 

private int age; 
private String name; 
... 
} 

Y las otras dos clases se declaran así:

@Entity 
public Class Father extends Parent { 

private boolean haveMustash; 
... 
} 

Así que, básicamente, el escenario es "tabla por clase".

Ahora quiero crear una declaración HQLnate HQL que actualice la edad de un padre, independientemente de su tipo (madre, padre). el padre se buscará usando la columna de nombre, que es única en ambas tablas. pero no sé si solo miro el nombre si es Madre o Padre. ¿Cómo puedo crear una declaración HQL que se verá en ambas tablas y devolver la entidad correcta para actualizar?

pensé en algo como esto: (pero que no tienen una idea de si es aún posible)

Parent parent = hibernateTemplate.find("from Mother,Father where name=" 
     + name); 

Respuesta

2
from Parent p where p.name = :name 

(no probado).

Tenga en cuenta que si funciona, dará lugar a dos consultas, ya que ambas entidades no tienen nada en común, excepto que heredan algunos atributos asignados de una superclase. No tiene herencia de entidad aquí y no implementa la tabla por estrategia de clase. Lo haría si Parent se anotara con @Entity en lugar de @MappedSuperClass, y si definió una estrategia de herencia usando @Inheritance.

+0

No funciona, obtengo El padre no está mapeado (excepción de Hibernación) – stdcall

+0

Bueno, luego asócielo. –

+0

Toda la idea es que no se mapee, es una clase abstracta, el padre y la madre toman su mapeo básico de ella. – stdcall

-1

De acuerdo con la referencia de Hibernate esto está funcionando!

Pueden aparecer varias clases, lo que da como resultado un producto cartesiano o una combinación "cruzada".

from Formula, Parameter

(Ver 14,2)

Hibernate Reference

También podría buscar en ambas tablas por separado y después comprobar cuál no es nulo?

1

La respuesta de JB Nizet es correcta. Use @Entity para mapear Parent, en lugar de @MappedSuperclass. Esto le permite ejecutar consultas y actualizaciones de Hibernate en Parent (este último solo le permite ejecutarlo en Father and Mother). Puede mantener su tabla por clase con la anotación @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS).

from Mother,Father no funcionará ya que esto se une implícitamente a las tablas. Lo que quieres es una unión. Usando @Entity, Hibernate hará esto automáticamente.

+0

Buena explicación. La información de herencia debe agregarse a la clase Parent para permitir que Hibernate haga su trabajo. – germanio

Cuestiones relacionadas