Java 8 et les dates


La nouvelle API Date et Time et JPA 2.1

Un LocalDate persistant

Décrit l’utilisation de la nouvelle API Date et Time de Java 8 avec des classes persistantes

Java 8 nous apporte de nouvelles classes de gestions de dates bien plus pratiques que les anciennes. Il pourrait être intéressant de les utiliser dans la définition de nos classes persistantes.


 Introduction

Avant la version 8, nous disposions de deux classes, java.util.Date et java.util.Calendar pour gérer les dates et le temps dans nos applications Java. La première, avait déjà la plupart de ces méthodes notés comme déprecated (obsolètes) et ne devait plus servir que de simple conteneur de données dates et nous devions utiliser Calendar pour effectuer toutes les manipulations et calcul par rapport à un calendrier. C’était pour cette raison, que de nombreux développeurs utilisaient la librairie tierce : JodaTime.

Remarque : Il existe également dans l’API java les classes java.sql  .Date, java.sql  .Time et java.sql.TimeStamp qui encapsulent les types SQL correspondant. Personnellement, je ne les utilisent pas pour ne pas être lié à des types spécifiques au SQL.

Heureusement, nous disposons maintenant d’une nouvelle API intégrée à Java SE. Cette API dispose à la fois de classes pour gérer le temps machine et de classes pour le temps humain.

  • Le temps machine correspond à une valeur qui représente le temps écoulé depuis le 1 janvier 1970 appelé epoch.
  • Le temps humain, lui est représenté par une valeur découpée en années, mois, jour, heure, minutes,... en fonction d’un calendrier.

Ces nouvelles classes sont définies dans le package java.time de Java 8. Dans cet article, je ne décrirais pas ces différentes classes mais je me contenterais de vous montrer comment les utiliser comme attribut de classes persistantes et JPA  .

 Classes persistante avec l’ancienne API

Voyons d’abord un exemple de classe persistante utilisant un champ date avant Java 8.

Cela pourrait ressembler à au code suivant :

  1. public class Personnel implements Serializable
  2. {
  3.   private static final long serialVersionUID = 1L;
  4.   @Id
  5.   @GeneratedValue(strategy = GenerationType.AUTO)
  6.   private Long id;
  7.  
  8.   @Column( length = 30 )
  9.   private String nom;
  10.  
  11.   @Column( length = 30 )
  12.   private String prenom;
  13.  
  14.   @Temporal( TemporalType.DATE )
  15.   private Date neLe;
  16. ...
  17.  

Télécharger

Remarque : L’annotation @Temporal permet de préciser avec quel type SQL nous voulons mapper notre attribut avec les types TemporalType.DATE, TemporalType.TIME et TemporalType.TIMESTAMP.

Voici un extrait de la méthode main() qui a pour but de créer la base de données et d’ajouter un enregistrement de test.

  1. public static void main(String[] args)
  2.   {
  3.     Personnel p1 = creePersonnel( "Durand", "Marcel", new Date() );
  4.    
  5.     EntityManagerFactory emf = Persistence.createEntityManagerFactory("TestJava8MysqlPU");
  6.     EntityManager em = emf.createEntityManager();
  7.     EntityTransaction tr = em.getTransaction();
  8.     tr.begin();
  9.     em.persist(p1);
  10.     tr.commit();
  11.     em.close();
  12.     emf.close();
  13.   }
  14.  
  15.   public static Personnel creePersonnel( String nom, String prenom, Date neLe )
  16.   {
  17.     Personnel p = new Personnel();
  18.     p.setNom(nom);
  19.     p.setPrenom(prenom);
  20.     p.setNeLe(neLe);
  21.     return p;
  22.   }

Télécharger

Si l’on demande au framework de persistance de générer la base à partir de notre classe, nous voyons que l’attribut java est bien mappé avec un type date SQL DATE.


Dans le cadre d’un projet WEB avec JSF, vous devrez également définir un FacesConverter pour ces nouveaux types.

Les différents exemples de cet article ont été testés avec JavaDB et MySQL en utilisant l’implémentation de JPA 2.1 de EclipseLink.

Article n° 23

Crée par: chris

Créé le: 3 mai 2015

Modifié le: 1er juillet 2015

Nombre de visites: 337

Popularité: 34 %

Popularité absolue: 1

Mots clés de cet article


SPIP

2003-2020 LePpf
Plan du site | | Contact | RSS 2.0

Visiteurs connectés : 0

Nombre moyen de visites quotidiennes sur le site: 138