2016-08-08 94 views
1

Ich habe mit Feder einfache Anwendung entwickelt 4.2.5 + Hibernate 5.1.0 - Datenbanksystem MS SQL Server 2014Spring + Hibernate + MS SQL Server - UTC-Zeitzone

Von wenigen Tagen, die ich mit korrektem habe Schwierigkeiten Speicherzeit + Zeitzone in der Datenbank.

Anforderungen, die ich erfüllen müssen, ist:

  1. speichern alle Daten in UTC-Zeitzone.
  2. Zeitzone in Datenbankspaltenwert speichern.

es zu erreichen, ich Modell namens MyComment erstellt:

@Entity 
@Table(name = "MY_COMMENT") 
@EntityListeners(value = { MyCommentListener.class }) 
@Audited 
public class MyComment implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID") 
    private Long id; 

    @Column(name = "DATE_", nullable = false) 
    private Timestamp date; 

    ... 
} 

Zur Durchsetzung Termine in Zeitzone UTC Speichern verwendet I Jadira Rahmen:

hibProperties.put("jadira.usertype.autoRegisterUserTypes", true); 
    hibProperties.put("jadira.usertype.javaZone", "UTC"); 
    hibProperties.put("jadira.usertype.databaseZone", "UTC"); 

jedoch jeder während erstellen/aktualisieren Betrieb MyComment-Objekt, MyCommentListener erhält Datum von meiner lokalen Zeitzone (nicht UTC-Datum!):

public class MyCommentListener { 

    @PreUpdate 
    @PrePersist 
    public void setLastUpdate(MyComment myComment) { 
     myComment.setDate(new Timestamp(System.currentTimeMillis())); 
    } 

}

Wissen Sie, wie ich dieses Problem lösen kann?

  1. Sollte ich einen anderen Datumstyp in meinem Modell verwenden? Anders als Timestamp?
  2. Welche Art von Typ sollte Spalte DATE_ in MS SQL Server-Datenbank sein?

Ich werde jede Hilfe zu schätzen wissen. Vielen Dank.

+0

vielleicht sollten Sie fügen Sie ein ‚jadira‘ tag. Sie sollten auch angeben, ob eine Zeitzone * Name * oder * Offset * in der Datenbankspalte gespeichert werden soll. –

+0

Könntest du es bitte mehr beschreiben? Ich verstehe nicht genau, was du meinst. – bontade

+0

Das Jadira-Tag, weil Sie ihre Typen verwenden. Ihre Anforderungen scheinen technisch (speichern Sie UTC) aber dann 'Zeitzone in Datenbankspaltenwert speichern'. Miss, um anzugeben, ob Zeitzonen-Offset oder -ID Identifier hat mehr Informationen, siehe https://www.w3.org/TR/timezone/#tzids und https://www.w3.org/TR/timezone/#datetime Es hängt davon ab, was Sie tun müssen. Was ist der Zweck der Speicherung der Zeitzone? –

Antwort

0

Es war sehr seltsam für mich, dass es keine Eigenschaft im Frühling gibt, um die Standard TimeZone einzurichten - zumindest weiß ich nichts darüber.

Nach einigen googeln fand ich heraus, dass der beste Platz im Frühjahr Zeitzone einstellen WebApplicationInitializer ist, so dass ich vorbereitet folgenden Code:

public class MyWebApplicationInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(final ServletContext servletContext) throws ServletException { 
     setupTimeZone(); 
    } 

    private void setupTimeZone() { 
     TimeZone.setDefault(TimeZone.getTimeZone("UTC")); 
    } 
} 
1

AFAIK, das Problem ist mit Zuhörer. Ersetzen Sie den folgenden Code in Listener und überprüfen Sie. Ändern Sie das Datumsformat nach Ihren Bedürfnissen.

+0

Ja, du hast Recht. Dieser Code funktioniert, aber ich suche nach einer generischen Lösung, die in meiner Spring-Anwendung standardmäßig die UTC-Zeitzone verwendet. Stellen wir uns vor, dass ich 10 Zuhörer habe, die meinen Modellen Zeit einflößen, dann müsste ich den obigen Code zehnmal wiederholen. Ich habe erwartet, dass, da ich Jadira verwende, UTC-Zeitzone als Standardzeitzone verwenden wird. – bontade

+1

Wenn Sie Ihre gesamte App in UTC setzen möchten, verwenden Sie sie zum Zeitpunkt des Starts TimeZone.setDefault (TimeZone.getTimeZone ("UTC")); –