Comment spécifier le fuseau horaire UTC pour le Printemps de Démarrage JPA Timestamp

Environnement

  • Printemps de Démarrage Démarreur de Données JPA 1.4.2
  • Eclipselink 2.5.0
  • Postgresql 9.4.1211.jre7

Problème

Je suis la construction d'un Printemps de Démarrage microservice qui partage une base de données Postgresql avec un autre service. La base de données est initialisé à l'extérieur (hors de notre contrôle) et la colonne datetime type utilisé par l'autre service est timestamp sans fuseau horaire. Donc, puisque je veux que toutes les dates sur le db d'avoir le même type, ayant ce type est une exigence pour mon entité JPA dates.

La façon dont je carte sur mon JPA objets de l'entité est comme suit:

@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 mon fuseau horaire local de date, mais je veux le ranger en UTC. C'est parce que mon Fuseau horaire par défaut est réglé à "l'Europe de Bruxelles" et JPA/JDBC convertit mon java.sql.Timestamp objet dans mon fuseau horaire avant de les mettre dans la base de données.

Trouve pas de solutions idéales

  • TimeZone.setDefault(TimeZone.getTimeZone("Etc/UTC")); a l'effet que je veux obtenir, mais il n'est pas approprié parce qu'il n'est pas spécifique à mon service. I. e. il aura une incidence sur l'ensemble de la JVM ou le thread en cours plus les enfants.
  • Démarrage de l'application avec -Duser.timezone=GMT semble aussi faire le travail pour une seule instance de l'exécution de la JVM. Par conséquent, une solution meilleure que la précédente.

Mais est-il un moyen de spécifier le fuseau horaire à l'intérieur de la JPA/source de données/printemps de configuration de démarrage?

Comment avez-vous "regardez la base de données"? Peut-être que c'est juste PostgreSQL réglage de l'horodateur à votre session de fuseau horaire? Voir cette réponse.
Merci de répondre à @Adam, je viens de SELECT * FROM my_table. Selon la réponse que vous avez lié, "quand on plus tard affichage d'horodatage, vous obtenez ce que vous avez entré littéralement". Si je SELECT my_timestamp AT TIME ZONE 'UTC' AT TIME ZONE 'UTC' FROM my_table je vois le même résultat, ce qui est logique. Considérant que, je suppose qu'il n'est pas PostgreSQL réglage du fuseau horaire, l'ajustement semble se produire avant que la valeur est dans la db sur le Java côté.

OriginalL'auteur oizulain | 2017-01-12