2009-09-14 12 views
6

¿Es posible configurar Hibernate para almacenar una clase de componente en una tabla separada?Asignación de los componentes de hibernación a una tabla separada

Tome el ejemplo siguiente:

<class name="test.ClassA"> 
    <property name="propA"/> 
    <component name="componentProp" class="test.ClassB"> 
     <property name="propB"/> 
    </component> 
</class> 

Esto se asigna a una tabla llamada MyClass con dos columnas y propApropB. Lo que quiero es asignar las propiedades del componente a una tabla llamada ClassB.

Lo que No quiero hacer es configurar ClassB como una entidad en sí mismo (que no tiene identidad significativa fuera de ClassA), por lo que descarta una asociación normal. Además, no puedo modificar el modelo de objeto (es código generado), por lo que no puedo introducir una propiedad de ID en ClassB.

Esto parece ser un vacío en la funcionalidad de Hibernate: la asignación de componente < realiza "múltiples-clases-a-una-tabla", y < se une> hace "una clase a tablas múltiples", pero curiosamente no hay una forma evidente de hacer "múltiples clases-a-tablas-múltiples", sin recurrir a asociaciones de entidades.

Mi razonamiento para querer esto es que quiero que mi esquema de base de datos se asemeje al modelo de objetos tan de cerca como sea práctico, y eso incluye tablas separadas para el componente ClassB. Entiendo que esto no se escala, por ejemplo, no se pueden hacer componentes anidados, pero esto no es un problema en esta situación particular.

Respuesta

6

Usted puede use <join> y <component> juntos, o no entendí bien su pregunta?

<class name="test.ClassA"> 
    <property name="propA"/> 

    <join table="ClassB"> 
    <key column="ClassA_id" /> 
    <component name="componentProp" class="test.ClassB"> 
     <property name="propB"/> 
    </component> 
    </join> 

</class> 

Mientras que (obviamente) necesita una clave externa, no tiene que estar mapeada en el modelo de objetos. Los detalles de unión son here - proporcionado por la totalidad única, sé que sabe dónde conseguirlos a partir :-)

de documentación en el enlace anterior no dice explícitamente nada acerca de los componentes de mapeo dentro une, pero sí lo permite DTD y lo he tenido funcionando en 3.1, así que estoy bastante seguro de que todavía funciona bien. Sin embargo, no sé cómo (o si es posible) mapear esto con anotaciones.

+0

Ah, eso parece justo lo que necesito, gracias por eso. La llevaré a dar una vuelta y veré si es el boleto. – skaffman

+0

Encontré esta técnica documentada en la sección 8.1.3 de "Java Persistence with Hibernate". Se ve bien Gracias de nuevo. – skaffman

+0

Gracias. De alguna manera logré nunca leer ese libro :-) – ChssPly76

Cuestiones relacionadas