jeudi 1 octobre 2015

Mapping d'une date d'anniversaire en JPA.

La version 2.1 de JPA et la version 5 de MySQL ont été utilisé.

Une date d'anniversaire s'affiche sous le format: dd/MM/yyyy. Ce format varie d'une région à une autre. Une telle date ne possède pas d'heure.

Si vous ne spécifiez par le bon type dans votre entité, vos risques de ne pas obtenir le format désiré à l'affichage.

L'annotation Temporal offre 3 valeurs: Date, Time et Timestamp. Le time est inutile pour un anniversaire.

Selon l'annotation, voici le type de donnée et le type en bd..
@Temporal(javax.persistence.TemporalType.DATE)
Data type date
DB data type date

@Temporal(javax.persistence.TemporalType.TIMESTAMP)
Data type timestamp
DB data type datetime

Si vous n'en spécifiez aucun, vous obtiendrez ceux de TemporalType.TIMESTAMP.


@Entity
public class personne{
  @Temporal(javax.persistence.TemporalType.TIMESTAMP)
  private Date anniversaire;
  ...
}

Au niveau de votre DTO, vous devez spécifiez le format.

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy")
private Date birthdate;

La valeur qui sera transféré sera

"anniversaire":"17/06/1980" au lieu

"anniversaire":"1980-06-17"

Si vous utiliser l'annotation DateTimeFormat de spring

@DateTimeFormat(pattern = "dd/MM/yyyy") dans votre DTO, vous allez obtenir une valeur numérique similaire à  14360400000.