hibernate 4 et joda-time

sont-ils heureux mariés?

J’utilise la dernière version de hibernate (4) et la version 1.3 du support hibernate de joda-time , que je pense également être la dernière version actuelle.

Tout semble fonctionner correctement (colonnes de date créées comme prévu) lors de l’utilisation des annotations:

@Column @Type(type="org.joda.time.consortingb.hibernate.PersistentLocalDate") private LocalDate myDate; 

Y at-il des problèmes connus avec l’utilisation de ces versions ensemble?

Update Well s’avère que les colonnes sont créées mais ne peuvent pas être remplies avec des données:

Le traitement du gestionnaire a échoué; l’exception nestede est java.lang.AbstractMethodError: org.joda.time.consortingb.hibernate.PersistentLocalDateTime.nullSafeSet

Ils sont incompatibles et je devrais utiliser le type d’ utilisateur. Voir la réponse ci-dessous.

Un manque de documentation distinct, cela pourrait être utile pour moi de noter les étapes nécessaires à l’intégration. Assurez-vous que vos bibliothèques sont à jour.

Vous aurez besoin de: [en supposant que vous avez déjà hibernate4]

Dernière version de joda-time

  joda-time joda-time 2.0  

et la librairie usert

  org.jadira.usertype usertype.core 3.0.0.CR1  

Ensuite, utilisez les éléments suivants dans les classes d’entité (ne doit pas nécessairement être LocalDateTime, l’une des classes persistantes disponibles):

 import org.joda.time.LocalDateTime; 

et pour la définition de colonne:

 @Column(name="updated", nullable = false) @Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime") private LocalDateTime updated; 

J’appendai ceci comme une réponse séparée, car à mon avis, il s’agit d’informations importantes pour toute personne effectuant une mise à niveau vers Hibernate 4 et ayant 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 vais donc l’append ici. (Pour une discussion séparée sur ce problème, voir: Heure de Joda DateTime stocke de manière incorrecte dans la firebase database )

Si vous êtes dans un fuseau horaire autre que UTC, un élément important de la configuration est nécessaire pour obtenir le même comportement que vous le feriez avec un type de support hibernate de joda-time. La façon dont les types temporels de jadira fonctionnent par défaut consiste à convertir toutes les valeurs dans le fuseau horaire UTC avant de persister dans la firebase database et de les reconvertir dans le fuseau horaire du système lors du chargement des valeurs de la firebase database.

Cela m’a brulé après la mise à niveau, quand j’avais beaucoup d’horodatages avec mon fuseau horaire exact dans la firebase database (UTC + 1 (+2 lorsque l’heure d’été)). Lorsqu’elles ont été chargées après la mise à niveau vers Hibernate 4, 1 ou 2 heures (selon que l’horodatage était ou non pendant l’heure d’été) ont été ajoutées à la valeur de la firebase database, ce qui signifie que tous les horodatages existants étaient présentés de manière erronée. En outre, les nouvelles valeurs d’horodatage étaient stockées dans la firebase database avec le fuseau horaire UTC, ce qui les faisait apparaître correctement dans l’application, mais dans la firebase database. Dans l’ensemble, un fouillis de fuseaux horaires et d’horodatages.

Donc, pour obtenir le même comportement qu’avec hibernate-support joda-times (le datetime étant conservé du fuseau horaire du serveur en question, et les horodatages de la firebase database étant les mêmes que ceux chargés dans l’application) , les propriétés suivantes doivent être ajoutées à la configuration JPA / Hibernate (dans mon cas, hibernate.properties ):

 jadira.usertype.autoRegisterUserTypes=true jadira.usertype.databaseZone=jvm jadira.usertype.javaZone=jvm 

Cela garantira que les horodatages de la firebase database seront du même fuseau horaire que celui de l’application, qui sera à son tour le fuseau horaire de jvm (dans la plupart des cas, l’horloge du serveur d’applications).

De plus, d’après ce que j’ai compris, la autoRegisterUserTypes autoRegisterUserTypes supprime la nécessité pour @Type -annotation pour une sélection de types communs, parmi lesquels les types de DateTime LocalDate DateTime et LocalDate .