2010-02-03 13 views
15

Mes entités contiennent actuellement des propriétés Date de java. Je commence à utiliser Joda Time pour la manipulation de date et les calculs assez fréquemment. Cela signifie que je dois constamment convertir mes dates en objets Joda DateTime et revenir en arrière.Persisting Joda DateTime au lieu de Java dans Date de mise en veille prolongée

Je me demandais, est-il une raison que je ne devrais pas simplement changer mes entités pour stocker des objets Joda DateTime au lieu d'objets Java Date?

S'il vous plaît noter que ces entités sont conservées par Hibernate. J'ai trouvé le projet jodatime-hibernate, mais je lisais aussi sur la liste de diffusion Joda qu'il n'était pas compatible avec les nouvelles versions d'Hibernate. Et il semble que ce ne soit pas très bien entretenu.

Je me demande s'il serait préférable de simplement continuer à convertir entre la date et DateTime, ou s'il serait sage de commencer persistant des objets DateTime. Ma préoccupation est de dépendre d'une bibliothèque mal entretenue.

Edit: Notez que l'un de mes objectifs est d'être mieux en mesure de stocker des informations fuseau horaire. Mémoriser juste une date apparaît pour enregistrer la date dans le fuseau horaire local. Comme mon application peut être utilisée globalement, je dois également connaître le fuseau horaire. Joda Time Hibernate semble également répondre à cette question dans the user guide.

+3

À ce stade, il semble que le type d'utilisateur pour Hibernate est la solution la plus courante et prise en charge par rapport à hibernate joda-time. Voir la réponse de @Chris ci-dessous pour plus d'informations. – Tauren

+0

+1, je me demandais à peu près la même chose. – Jonik

Répondre

3

Je pense à l'aide du Joda DateTime comme type de propriété de haricot est probablement une bonne idée. Vous pouvez ensuite faire en sorte que Hibernate effectue la conversion et enregistrer la propriété en tant que format de date de base de données native.

J'ai personnellement utilisé jodatime-hibernate et je n'ai pas eu de problème avec celui-ci (nous utilisons Hibernate 3.2.5GA).

Si vous avez des inquiétudes à propos de jodatime-hibernate, vous pouvez toujours utiliser Hibernate's custom type mapping mechanism (ce que je suis sûr, c'est que jodatime-hibernate fait).

+0

Je suis heureux d'apprendre que vous utilisez avec succès joda-time pour les propriétés des haricots. J'utilise Hibernate 3.3, qui donne l'impression que les gens ont des problèmes. Mais je crois que vous avez raison, joda-time est simplement un type personnalisé d'hibernation, donc peut-être qu'avec quelques réglages je peux le faire fonctionner. – Tauren

-4

dates ne doivent pas être stockées à l'aide d'un haut niveau d'abstraction comme, par exemple, une chaîne (« 2009-08-07 07:43:19 ... »), ni comme des objets Java. Ils devraient être persistés en millisecondes depuis l'époque. L'heure de Joda et l'heure de la date Java régulière peuvent vous donner le temps en millisecondes depuis l'époque. Stockez le nombre de millisecondes écoulées et convertissez-les en objets lorsque vous lisez à partir de votre base de données.

Persistant objets lourds Date au lieu d'un long est un peu comme l'utilisation de nombres à virgule flottante pour représenter les montants monétaires: il est généralement une énorme odeur de code.

+4

Cela ne semble pas très utile pour les utilisateurs non orientés objet de cette base de données. Personne ne pourrait interroger ce schéma et interroger toutes les commandes passées aujourd'hui. Normalement, je suis d'accord avec des conseils comme celui-ci, mais il semble trop Java et centré sur les objets pour moi. – duffymo

+6

La plupart (toutes?) Bases de données ont des abstractions de date ... –

+0

J'ai certainement considéré les dates de stockage comme une longue (millis depuis l'époque), mais je voudrais faire des requêtes SQL de base et être capable de voir des dates lisibles. En outre, certaines de mes requêtes effectuent des calculs de date que la DB ne pourrait pas gérer avec des valeurs longues au lieu des valeurs de date. – Tauren

5

Joda Time Hibernate peut être utilisé avec les versions récentes d'Hibernate - vous aurez peut-être besoin de peaufiner un peu votre graphe de dépendances (par exemple, les exclusions de configuration). Puis-je également vous suggérer de regarder le type d'utilisateur, que j'ai publié sur Sourceforge. Cela fournit des types d'utilisateurs pour Joda Time qui visent à éviter le problème de décalage client que vous avez mentionné. Je serais heureux de recevoir vos commentaires sur ce projet. https://sourceforge.net/projects/usertype/files/

Cordialement Chris.

3

Donc, pour résumer:

java.util.Date

  • +   support natif dans Hibernate
  • - mauvaise API

Joda-Time

  • +   meilleure API
  • -  manque de soutien natif à Hibernate

Personnellement, si je pouvais garder le modèle de domaine et « couche de service » propre en utilisant simplement une bibliothèque tierce partie (apparemment User Type for Hibernate dans ce cas) et l'alternative serait d'écrire un code supplémentaire pour effectuer la conversion " manuellement "chaque fois que c'était nécessaire, j'irais avec la bibliothèque de tiers.