Je vais ajouter cette réponse séparément car il s'agit, à mon avis, d'une information importante pour tous ceux qui passent à Hibernate 4 et qui ont besoin de migrer vers l'utilisation des types temporels persistants de Jadira. Cette page est très bien classée dans les résultats de recherche google pour hibernate 4 et jodatime, je l'ajoute donc ici. (Pour une discussion séparée de cette question, voir : Joda time DateTime stocke incorrectement dans la base de données )
Si vous êtes dans un fuseau horaire autre que UTC, un élément de configuration important est nécessaire afin d'obtenir le même comportement qu'avec un type temporel joda-time hibernate-support. Les types temporels de jadira fonctionnent par défaut en convertissant toutes les valeurs dans le fuseau horaire UTC avant de les persister dans la base de données, et en les reconvertissant dans le fuseau horaire du système lors du chargement des valeurs depuis la base de données.
J'ai été victime de ce problème après la mise à niveau, lorsque j'avais beaucoup d'horodatages avec mon fuseau horaire exact dans la base de données (UTC+1 (+2 en été)). Lors du chargement après la mise à niveau vers Hibernate 4, 1 ou 2 heures (selon que l'horodatage était ou non en heure d'été) ont été ajoutées à la valeur dans la base de données, ce qui signifie que tous les horodatages existants étaient présentés de manière erronée. De plus, les nouvelles valeurs d'horodatage étaient stockées dans la base de données avec le fuseau horaire UTC, ce qui faisait qu'elles apparaissaient correctement dans l'application, mais incorrectement dans la base de données. En somme, un fouillis de fuseaux horaires et d'horodatages.
Ainsi, afin d'obtenir le même comportement qu'avec le support hibernate de joda-times (le temps de date persistant étant du fuseau horaire du serveur en question, et les horodatages dans la base de données étant les mêmes que ceux qui sont chargés dans l'application), les propriétés suivantes doivent être ajoutées à la configuration de JPA/Hibernate (dans mon cas, hibernate.properties
) :
jadira.usertype.autoRegisterUserTypes=true
jadira.usertype.databaseZone=jvm
jadira.usertype.javaZone=jvm
Cela permettra de s'assurer que les horodatages dans la base de données seront du même fuseau horaire que celui de l'application, qui à son tour sera le fuseau horaire du jvm (dans la plupart des cas l'horloge du serveur d'application).
De plus, d'après ce que j'ai compris, le autoRegisterUserTypes
-supprime la nécessité de la propriété @Type
-pour une sélection de types courants, dont les types Jodatime. DateTime
et LocalDate
.