2010-04-14 8 views
1

J'ai une classe Player qui contient une liste d'objets Accessory. Il existe deux types d'accessoires. SocketedAccessories a une liste de SocketJewels, et MagicAccessories a une liste de MagicEnchantments. Au niveau de la base de données, il existe un tableau players représentant le lecteur et un tableau accessories contenant une liste d'accessoires. Les accessoires ont un champ type qui indique s'ils sont ensachés ou magiques, et les colonnes qui ne sont utilisées que par un type sont simplement laissées vides par les entrées de l'autre type. Il ya socket_jewels et magic_enchantments tables, représentant les bijoux de douille ou les enchantements magiques sur chaque accessoire.Hibernate collection plusieurs types

J'essaie de trouver la bonne façon de mapper cela avec Hibernate. Une façon serait que le joueur ait deux listes d'accessoires, une pour SocketedAccessories et une pour MagicAccessories. Cela semble indésirable, cependant. Ce que je veux, c'est un moyen de spécifier que le joueur doit avoir un champ List<Accessory> accessories qui contient les deux types de choses.

Existe-t-il un moyen de dire à Hibernate, dans hbm.xml ou dans les annotations, de le faire?

Répondre

2

Existe-t-il un moyen de dire à Hibernate, dans hbm.xml ou dans les annotations, de le faire?

Qu'est-ce que vous décrivez ressemble à un une seule table par classe Stratégie Hiérarchie (toutes les propriétés de tous les super et les sous-classes sont mises en correspondance dans la même table, les instances se distinguent par une colonne spéciale discriminante).

Vous pouvez mapper ce avec annotations et/ou xml mappings (et un seul List, Hibernate supporte les requêtes polymorphes à savoir que vous pouvez interroger sur la Accessory superclasse et obtenir une liste des sous-classes).

Mise à jour: Si Accessory est une interface, jetez un oeil à this previous answer.

+0

C'est une bonne nouvelle! Bien que, il semble que "Accessoire" doit être une classe de base et pas une interface si je veux avoir une liste d'eux? –

+0

@CaptainAwesomePants Accessory peut être une interface. Mais vous devrez peut-être utiliser hbm alors. La documentation de base d'hibernate mentionne explicitement que vous pouvez utiliser des interfaces. Je vais ajouter un lien vers une autre réponse couvrant le cas des interfaces avec JPA. –

+0

Ah, je vois, j'ai raté le fait que Payment était une interface (et aussi raté le bit "annotating interfaces is currently not supported"). Je vous remercie! –

Questions connexes