2010-04-26 13 views
2

J'essaie de mapper un modèle Java normalisé à un schéma de base de données existante en utilisant Hibernate 3.5. Une table particulière code une clé étrangère dans une relation un-à-plusieurs en tant que colonne de tableau de bits.Hibernate tableau de bits à la cartographie de l'entité

Tenir compte des tables person et club qui décrit les affiliations des gens aux clubs:

person: .----.------. club: .----.---------.---------------------------. 
     | id | name |   | id | name | members | binary(members) | 
     |----+------|   |----+---------|---------+-----------------| 
     | 1 | Bob |   | 10 | Cricket |  0 |    000 | 
     | 2 | Joe |   | 11 | Tennis |  5 |    101 | 
     | 3 | Sue |   | 12 | Cooking |  7 |    111 | 
     '----'------'   | 13 | Golf |  3 |    100 | 
           '----'---------'---------'-----------------' 

donc nous espérons qu'il est clair que person.id est utilisé comme indice de bit dans le tableau de bits club.members:

.---.---.---. 
| S | J | B | 
| u | o | o | 
| e | e | b | 
|---+---+---| 
| 1 | 0 | 1 | 
'---'---'---' 

En cet exemple, la colonne members nous dit que:

  • n'est membre de Cricket --- pas de drapeaux mis
  • Bob/Sue -> Tennis --- drapeaux aux positions 1 et 3 sont mis
  • Bob/Sue/Joe -> Cuisine --- drapeaux aux positions 1, 2 et 3 sont mis en
  • Sue -> Golf --- drapeau à la position 3 est réglé

maintenant, pour cet exemple une table de jointure aurait pu être utilisé à la place qui simplifierait les choses et éviter de nombreux problèmes potentiels - par exemple: la plage maximale de members en plaçant une limite supérieure sur le nombre de people lignes. Cependant, je suis coincé avec ce schéma et il semble qu'il y avait des facteurs en faveur de l'utilisation d'une colonne de tableau peu à l'époque.

Dans mon domaine Java Je voudrais modéliser ce schéma avec des entités comme ceci:

class Person { 
    private int id; 
    private String name; 
    ... 
} 

class Club { 
    private Set<Person> members; 
    private int id; 
    private String name; 
    ... 
} 

Je suppose que je dois utiliser une mise en œuvre UserType mais ont été incapables de trouver des exemples où les éléments décrits par le type d'utilisateur sont des références à des entités - et non à des valeurs de champ littérales - ou à des composites de celles-ci. De plus, je suis conscient que je vais devoir considérer comment les entités person sont récupérées lorsqu'une instance club est chargée.

Quelqu'un peut-il me dire comment je peux apprivoiser ce schéma hérité avec Hibernate?

Mise à jour

J'ai récemment dû revoir ce type de cartographie dans une base de données existante. Cette fois-ci, il est devenu évident que notre équivalent de la table members était en fait un ensemble statique et pouvait être codé en dur en tant que Enum. Avec cette simplification, il était assez simple d'implémenter un Hibernate UserType converti entre le tableau de bits et un ensemble d'énumérations.

+0

Avez-vous été en mesure de comprendre cela? – rj2700

Répondre

1

Je ne l'ai jamais fait face à cette situation, mais je pense que vous aurez besoin de mettre en œuvre une coutume UserCollectionType (voir chapitre 5.2.3. Custom value types dans la documentation Hibernate Core), le UserCollectionType étant un point d'extension qui peut être utilisé pour soutenir tout collection foutue et sémantique de collection vous aimez.

Je ne suis pas sûr à quel point ils sont supportés par des annotations bien (selon HHH-4417, vous devrez peut-être utiliser un hack).En utilisant hbm.xml pour ce serait une bonne idée ici IMO.

Quelques autres pointeurs/discussions:

+0

Malheureusement, il semble que 'UserCollectionType' n'est pas très utile dans cette instance. Son but est de permettre à Hibernate de peupler une 'Collection' de votre choix avec un tas d'entités qu'il a chargées à partir d'une jointure par exemple. Mon cas est assez différent - j'ai besoin que Hibernate interprète les valeurs dans un champ comme un ensemble de clés pour les entités, puis crée des proxies pour ces entités, puis ajoute ces proxies à 'Collection'. En tout cas - merci pour votre suggestion! – teabot

+0

Avez-vous pensé à convertir les données de la base de données dans une table temporaire, puis à créer un mappage à partir de cet agrégat simplifié? Vous ne pourrez peut-être lire que ... juste une pensée. – JamesC