Environnement
- Spring Boot Starter Data JPA 1.4.2
- Eclipselink 2.5.0
- Postgresql 9.4.1211.jre7
Problème
Je construis un microservice Spring Boot qui partage une base de données Postgresql avec un autre service. La base de données est initialisée en externe (hors de notre contrôle) et le type de colonne datetime utilisé par l'autre service est timestamp sans fuseau horaire . Par conséquent, puisque je veux que toutes les dates de la base de données aient le même type, ce type est une exigence pour les dates de mon entité JPA.
La façon dont je les mappe sur mes objets d'entité JPA est la suivante :
@Column(name = "some_date", nullable = false)
private Timestamp someDate;
Le problème est que lorsque je crée un Timestamp comme suit :
new java.sql.Timestamp(System.currentTimeMillis())
et je regarde la base de données, l'horodatage contient la date et l'heure de mon fuseau horaire local, mais je veux le stocker en UTC. En effet, mon fuseau horaire par défaut est défini sur "Europe/Bruxelles" et JPA/JDBC convertit mes données en UTC. java.sql.Timestamp
dans mon fuseau horaire avant de le mettre dans la base de données.
Les solutions trouvées ne sont pas idéales
-
TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC"));
a l'effet que je veux obtenir, mais il n'est pas adapté car il n'est pas spécifique à mon service. C'est-à-dire qu'elle affectera toute la JVM ou le thread actuel et ses enfants. -
Démarrer l'application avec
-Duser.timezone=GMT
semble également faire le travail pour une instance unique d'une JVM en cours d'exécution. Il s'agit donc d'une meilleure solution que la précédente.
Mais existe-t-il un moyen de spécifier le fuseau horaire dans la configuration de JPA/datasource/spring boot ?