2011-02-01 15 views
9

Tengo dos clases de hibernación: una clase base y una clase extendida que tiene campos adicionales. (. Estos campos se asignan por otras tablas)Asignación de varias clases a una tabla en hibernación, sin una columna DTYPE

Por ejemplo, tengo:

@Entity 
@Table(name="Book") 
public class A { 
    private String ID; 
    private String Name; 
    // ... 
} 

@Entity 
@Table(name="Book") 
public class B extends A { 
    public String node_ID; 
    // ... 
} 

public class Node { 
    public String ID; // maps to B.node_ID 
    // ... 
} 

¿Cómo puedo asignar esta en Hibernate? The hibernate documentation indica tres tipos de configuraciones de herencia: una tabla por clase, una tabla con una columna de tipo y una tabla de unión, ninguna de las cuales se aplica aquí.

La razón por la que necesito hacer esto es porque la clase A proviene del marco genérico que se reutiliza en múltiples proyectos, y la clase B (y el Nodo) son extensiones específicas de un proyecto; no se usarán nuevamente. En el futuro, tal vez tenga una clase C con un house_ID o algún otro campo.

Edit: Si pruebo la configuración de pseudocódigo anterior (dos entidades asignadas a la misma tabla) me sale un error que dice que la columna DTYPE no existe. El HQL tiene un "donde DTYPE =" A" adjunta

+0

Si estas clases se asignan a la misma tabla sin columna discriminadora, ¿cómo Hibernate distinguir cuál es cuál? – axtavt

+0

@axtavt ese es el punto, cada instancia de B también es un A. – ashes999

Respuesta

10

Esto es posible mediante el mapeo de la @DiscriminatorColumn y @DiscriminatorValue a los mismos valores para ambas clases;. Esto puede ser de cualquier columna que utilizar que tiene los mismos datos independientemente de los cuales escribir (no estoy seguro si funciona con valores nulos)

las clases deben mirar este modo:.

@Entity 
@Table(name="Book") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="published") 
@DiscriminatorValue(value="true") 
public class A { 
    private String ID; 
    private String Name; 
    // ... 
} 

@Entity 
@Table(name="Book") 
@DiscriminatorValue(value="true") 
public class B extends A { 
    public String node_ID; 
    // ... 
} 
Cuestiones relacionadas