2011-06-28 1 views
3

je traite avec une table existante d'événements:Comment cartographier tables de consultation dans Hibernate pour les données semi-statiques

Event Table: 
id event_type   status ... 
== ==========   ====== 
1 high.temperature ACCEPTED 
2 missing.invoice  WAITING 
3 missing.invoice  WAITING 

Actuellement, il y a quelques centaines event_types et cinq statut. Cette table a des millions de lignes, et j'aimerais réduire sa taille en utilisant des tables de recherche pour event_type et status. status est correct, car il a un petit nombre de valeurs statiques, mais event_type est contrôlé par des systèmes externes et les événements sont parfois reçus par mon système avec de nouvelles valeurs qui devront être ajoutées aux tables de recherche. Je crois que la structure de table existante a été choisie pour rendre le mappage avec hibernate facile, ce qui se fait plutôt bien, mais entraîne beaucoup de redondance.

Ce que je veux est quelque chose comme ceci:

Event Table: 
id event_type status ... 
== ========== ====== 
1 223   3 
2 245   4 
3 245   4 

EventType Table: 
event_type name 
========== ================ 
223   high.temperature 
245   missing.invoice 

Ma question est, est-il possible d'automatiser des inserts et sélectionne à/de la table de consultation, de sorte que je n'ai pas à définir une classe Java pour EventType et rechercher le EventType approprié chaque fois que j'insère dans Event? Du côté java, je préférerais traiter le event_type comme un String simple, comme c'est le cas maintenant.

Répondre

3

Les opérations de lecture ne devrait pas causer de problème: créer une entité EventType, ajoutez un privé avec impatience par les cheveux beaucoup à une relation entre Event et EventType, mis EventType dans le cache de second niveau, et ajouter un getter retourner la le nom du type d'événement dans Event. Cela le rend transparent pour le reste de l'application, et ne provoque pas de sélections supplémentaires grâce au cache de second niveau.

L'insertion est plus difficile, car vous ne voulez probablement pas que vos entités accèdent à la session pour que les nouveaux types d'événements soient persistants. Et même si cela était acceptable, je suppose que vous voudriez avoir une contrainte unique pour le nom du type d'événement, ce qui pourrait faire échouer certaines créations d'événements si deux événements avec le même nouveau type d'événement sont créés en parallèle.

Je créerais un service qui «obtiendrait ou créerait» un type d'événement basé sur un nom. Ce service utiliserait une transaction dédiée pour créer le type d'événement afin de réduire la probabilité de conflits. Et j'utiliserais ce service chaque fois que je devrais assigner un type d'événement à un événement (ce qui, je suppose, devrait être beaucoup moins fréquent que la lecture du type d'un événement).

+0

Merci pour votre aide. Un service "get ou create" est à peu près ce que je pensais, mais j'espérais que je trouverais une manière plus automatique de faire ces mises à jour, peut-être une fonctionnalité magique d'Oracle qui s'insère dans la table de recherche basée sur le FK. –

Questions connexes