2009-09-14 5 views
6

Est-il possible de configurer Hibernate pour stocker une classe de composants dans une table séparée?Mappage des composants d'Hibernate sur une table séparée

Prenons l'exemple suivant:

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

Mappe à une table appelée MyClass avec deux colonnes propA et propB. Ce que je veux est de mapper les propriétés du composant à une table appelée ClassB.

Ce que je ne veux faire est de configurer ClassB comme une entité en elle-même (il n'a pas d'identité significative en dehors de ClassA), de sorte que les règles une association normale. En outre, je ne peux pas modifier le modèle objet (c'est le code généré), donc je ne peux pas introduire une propriété ID à ClassB. Cela semble être une lacune dans la fonctionnalité d'Hibernate - le mappage <> effectue "plusieurs classes à une seule table", et < joint> fait "une classe à plusieurs tables", mais bizarrement, il n'y a pas de façon apparente de faire des "tables multiples à plusieurs tables", sans avoir recours aux associations d'entités. Ma raison pour vouloir cela est que je veux que mon schéma de base de données ressemble au modèle d'objet aussi près que possible, et cela inclut des tables séparées pour le composant ClassB. Je comprends que cela ne serait pas à l'échelle - vous ne pourriez pas faire de composants imbriqués, par exemple, mais ce n'est pas un problème dans cette situation particulière.

Répondre

6

Vous pouvez utiliser <join> et ensemble, ou ai-je mal compris votre question?

<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> 

Pendant que vous (évidemment) avez besoin d'une clé étrangère, il ne doit pas être mis en correspondance dans le modèle d'objet. Les détails sur jointure sont here - à condition d'exhaustivité que, je sais que vous savez où les trouver de :-)

Documentation sur le lien ci-dessus ne dit pas explicitement quoi que ce soit sur les composants cartographiques au sein des jointures, mais DTD ne lui permettent et je l'ai eu fonctionnant en 3.1, donc je suis à peu près sûr qu'il fonctionne toujours bien. Je ne sais pas comment (ou s'il est possible) de mapper ceci avec des annotations, cependant.

+0

Ah, ça ressemble à ce dont j'ai besoin, merci pour ça. Je vais l'emmener faire un tour et voir si c'est le billet. – skaffman

+0

J'ai trouvé cette technique documentée dans la section 8.1.3 de "Java Persistence with Hibernate". Ça a l'air sain. Merci encore. – skaffman

+0

Merci. J'ai en quelque sorte réussi à ne jamais lire ce livre :-) – ChssPly76

Questions connexes