2010-11-15 2 views
1

J'utilise Joda Time DateTime pour gérer la date et l'heure. Je persiste des objets de ce genre en utilisant la classe PersistentDateTime incluse dans le jodatime hibernate code.Ojects de temps persistants en tant qu'entités au lieu de types de valeur?

J'ai de grandes collections d'objets DateTime, et je persiste actuellement les de la manière suivante (un extrait d'un fichier de mappage de mise en veille prolongée suit):

<set name="validInstants" sort="natural"> 
    <key column="myobject_id"/> 
    <element column="date" type="myproject.utilities.hibernate.types.PersistentDateTime"/> 
</set> 

Ce faisant, à savoir le stockage DateTimes comme types de valeur , Je reçois plusieurs éléments en double dans la table validInstants, des centaines de milliers d'entre eux. Je voudrais éviter cela et avoir dans la table validInstants les DateTimes nécessaires, stockées une fois par valeur. Comment puis-je atteindre cet objectif? Pour autant que je sache (je suis et Hibernate débutant) la seule façon d'y parvenir est de créer une classe qui enveloppe un DateTime et le mappe en tant qu'entité, en plus de créer une usine qui renvoie toujours le même DateTime- wrapper lorsque vous demandez la même date. Est-ce la meilleure façon de faire ce que je veux? Suggestions?

Répondre

0

Quelle est exactement la relation entre l'entité stockée ici et l'ensemble validInstants? Est-ce que l'entité "possède" les validInstants? Est-ce qu'un membre de validInstants a une utilisation ou une vie en dehors de l'entité dont il est déclaré comme faisant partie? Si ce n'est pas le cas, je ne pense pas qu'il soit logique de traiter une entité non-entité comme une entité (ce que vous feriez si vous "créez une classe qui enveloppe un DateTime et le mappe comme une entité").

Je ne m'inquiéterais pas d'avoir de nombreux éléments en double dans la table qui stockent ces dates, à moins que ce ne soit un gros problème. Avec l'indexation sur la colonne myobject_id, ces recherches devraient être assez rapides.

+0

Un membre validInstants, c'est-à-dire un DateTime, peut être utilisé par de nombreux autres objets, par exemple, si je me réfère à la date "2001-01-01". Je me réfère à ce jour, mais si je n'ai pas d'usine centrale, de nombreux objets différents sont créés pour le même jour. Et il semble que le concept d '«instant dans le temps» puisse être considéré comme une entité. J'ai actuellement ~ 8000 DateTimes distinctes stockées, avec un total d'environ 250000 d'entre eux. Un problème survient, par exemple, lors du chargement de toutes ces valeurs: il est plus lent que de charger 8000 lignes au lieu de 250000 (et j'en ai 250000 dans les objets mémoire au lieu de 8000) – cdarwin

+0

Etes-vous vraiment sûr que c'est beaucoup plus lent? Avez-vous évalué les deux options? Le but d'éléments comme vous utilisez aujourd'hui est que vous n'avez pas à vous soucier des décisions de cycle de vie d'entité avec des non-entités. Bien sûr, vous pouvez traiter "instantané dans le temps" comme une entité et créer une table qui tient chaque instant possible dans le temps. Mais pourquoi voudriez-vous faire cela? Quelle valeur le datetime a-t-il en dehors de l'entité ici? Je doute que vous essayez de construire une base de données "instantanée". –

Questions connexes