2009-05-27 15 views
7

Tengo un objeto con un campo que puede ser una cantidad de tipos de objetos. Este objeto está codificado en una sola tabla con una columna discriminatoria para los subtipos del campo. Cada uno de estos subtipos tiene asignados sus campos a una columna en la tabla de objetos principales. Parece que no puedo modelar esto en Hibernate. El código siguiente devolverá nulo para getSubfield(), independientemente de los datos de subtipo que haya en la tabla.Herencia incrustable Hibernate

esquema

 
    id type whosit whatsit 
+----+------+--------+---------+ 
| 1 | "A" | "test" | null | 
| 2 | "B" | null | "test" | 
+----+------+--------+---------+ 

de objetos de dominio

@Entity 
public class Parent { 
    protected @Id @GeneratedValue int id; 
    protected Subfield subfield; 

    public Subfield getSubfield() {return subfield;} 
} 


@Embeddable 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING) 
public abstract class Subfield {} 


@DiscriminatorValue("A") 
public class TypeA extends Subfield { 
    public String whosit; 
} 


@DiscriminatorValue("B") 
public class TypeB extends Subfield { 
    public String whatsit; 
} 

"SELECT P del padre p"

{id=1,subfield=null} 
{id=2,subfield=null} 

Es posib Para lograr lo que quiero con este modelo de objetos, o necesito ser un poco más creativo (esto es una base de datos heredada, cambiar el esquema no es el preferido)

+1

Un colega en el trabajo me señaló http://opensource.atlassian.com/projects/hibernate/browse/HHH-1910. Supongo que no es compatible = \ –

Respuesta

3

Ok, no puede cambiar fácilmente el esquema, pero ¿Qué tal si agregamos un par de vistas?

+1

Buena idea, lamentablemente, sigue siendo una modificación de la estructura de la base de datos. Estoy tratando de resolver esto con código, si nada más, parece algo que hibernate podría hacer y tengo curiosidad sobre lo que estoy haciendo mal. –

+1

+1 a su comentario y recordándole a SO que a veces, no podemos "corregirlo" y arreglar diseños de esquemas incorrectos. :-) – cbmeeks

5

Según lo indicado por el asker, la hibernación no es compatible con la herencia de las clases incrustables (https://hibernate.atlassian.net/browse/HHH-1910).

Según el wiki de Eclipse, el JPA no especifica este comportamiento, pero EclipseLink sí lo admite (http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Embeddable#Inheritance).

Mi sugerencia es destruir la jerarquía de clases completamente dentro del Subcampo. Horrible, pero debería funcionar hasta que esto se resuelva.

1

Sé que esto es viejo.

Una forma de evitar esto es como se especifica anteriormente. Crea una vista Usted dice que no quiere cambiar el esquema. Entonces no. Puede crear un nuevo esquema que mapee el esquema anterior y haga lo que desee. (Posiblemente dependiendo de la base de datos)

Cuestiones relacionadas