juil 03

Joda Time est une librairie destinée à remplacer les classes Date et Time du JDK.
Date et Time ont très peu évolué depuis le début du JDK, elles sont maintenant assez pénibles à utiliser sans devoir toujours re-coder les mêmes utilitaires.

Que la Force soit avec nous

C’est là que Joda Time intervient :

  • Joda Time est facile à utiliser grâce à des méthodes simples : par exemple getYear() ou getDayOfWeek().
  • L’implémentation des TimeZones se base sur la base de données publique. Les releases de Joda Time incorporent les mises à jour de cette base de données.
  • 8 systèmes de calendrier.
  • L’interopérabilité avec le JDK est simplifiée : la librairie utilise en interne la milliseconde, ce qui la rend facile interopérable avec les classes du JDK.
  • Des calculs simplifiés : il est très facile de rajouter ou enlever une durée à une date.
  • Joda Time est open source : sous licence.

La documentation est très complète et la Javadoc complète le reste de l’API.

Persistence de DateTime

Intéressons nous à la persistence d’une des classes de Joda Time : org.joda.time.DateTime.

DateTime sert à représenter une date avec une précision de la milliseconde. Il s’agit d’une des classes les plus utilisées dans la librairie Joda Time. De plus, elle est thread-safe et immutable.

Le projet Usertype for Hibernate Parent offre un moyen de persister en base de données via Hibernate (version 4.0 minimum) une instance de DateTime dans une colonne de type Date. Il s’agit du seul moyen de persister des objets Joda Time pour les versions supérieures à 2.x.

Du côté de Maven

Il faut tout d’abord ajouter les dépendances Joda Time et UserType à votre pom Maven :

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.1</version>
</dependency>
<dependency>
    <groupId>org.jadira.usertype</groupId>
    <artifactId>usertype.core</artifactId>
    <version>3.0.0.CR1</version>
</dependency>

Il suffit maintenant d’utiliser la classe DateTime comme attribut d’une entité Hibernate et de l’annoter avec UserType pour pouvoir la persister :

    ...
    @Column
    @Temporal(TemporalType.DATETIME)
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    public DateTime date;
    ...

Du côté de Play! Framework 1.x

Attention : depuis la version 1.2.4 du framework Play!, Joda Time a été upgradé en version 2.x. Cet article traite de la seule façon de persister des objets Joda Time pour la librairie > 2.x.

Pour une application utilisant le framework Play! (> 1.2.4), il suffit de déclarer les dépendances dans son fichier dependencies.yml :

require:
    ...
    - org.jadira.usertype -> usertype.core 3.0.0.CR1:
        exclude:
          org.joda -> joda-money
    ...

Le code Java de l’entité reste inchangé :

    ...
    @Column
    @Temporal(TemporalType.DATETIME)
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    public DateTime date;
    ...

Adaptez votre @Temporal en fonction de la précision souhaitée pour la colonne dans votre base de données.

Le code mort tu supprimeras !

Vous pouvez maintenant supprimer toutes vos classes DateUtils et supprimer le code mort qui servait à faire des conversions de dates à tout va !

Rappelez-vous : du code mort est du code supprimé !

One Response to “Persister ses dates avec JodaTime”

  1. Bonjour,

    Plutôt que de déclarer des @Type sur tous les champs de type DateType (bonjour la duplication + type est une String difficile à refactorer), il est plus efficace de centraliser cette déclaration dans un @TypeDef, typiquement en annotant un package (package-info.java):

    @TypeDef(name = “DateTime”, typeClass = PersistentDateTime.class, defaultForType = DateTime.class)
    package com.excilys.ebi.bank.model.entity;

    import org.hibernate.annotations.TypeDef;
    import org.jadira.usertype.dateandtime.joda.PersistentDateTime;
    import org.joda.time.DateTime;

Leave a Reply


Creative Commons License
Blog Infin-It par Infin-It est mis à disposition selon les termes de la licence Creative Commons Paternité-Pas d'Utilisation Commerciale 2.0 France.