2012-10-13 6 views
5

Ich habe eine einfache Entitätsklasse mit einer Date-Eigenschaft. Diese Eigenschaft entspricht einer MySQL-Datetime-Spalte. Dauerhaftes Datum in der Datenbank ungleich dem abgerufenen Datum

@Entity 
public class Entity { 

    @Column(name = "start_date") 
    @Temporal(TemporalType.TIMESTAMP) 
    private java.util.Date startDate; 

} 

Dies ist, was ein Integrationstest I sieht aus wie schrieb:

java.util.Date now = new java.util.Date(); 
Entity entity = new Entity(); 
entity.setStartDate(now); 
entityService.save(entity); // save entity to database 
entity = entityService.get(entity.getId()); // get entity back from database 
Assert.assertEquals(entity.getStartDate(), now); 

würde ich diese beiden Daten erwarten gleich zu sein, aber sie sind es nicht! Eigentlich habe ich:

now.getTime() = 1350160029831 
entity.getStartDate().getTime() = 1350160029000 

so gibt es eine kleine Lücke zwischen den beiden Daten. Ich frage mich wirklich, wo diese Lücke herkommen könnte. Es ist nicht immer das Gleiche und variiert jedes Mal, wenn ich den Testprozess starte. In meiner Datenbank ist das gespeicherte Datum 2012-10-13 22: 15: 38.0.

Muss ich wirklich irgendwo Millisekunden löschen?

Antwort

3

Vom MySQL documentation:

A DATETIME- oder Zeitstempelwert kann in bis zu Mikrosekunden (6-stellig) Präzision einen nachlauf fraktionierten Sekunden Teil umfassen. Obwohl dieser Bruchteil erkannt wird, wird er aus Werten verworfen, die in DATETIME- oder TIMESTAMP-Spalten gespeichert sind. Informationen zur Sekundenunterstützung in MySQL finden Sie in Abschnitt 11.1.5.6, "Sekundenbruchteile in Zeitwerte".

Beachten Sie, dass Sie sollten nicht gleich verwenden, um Daten sowieso zu vergleichen, da die verschiedenen Datum Subklassen haben Buggy-Implementierungen, die Probleme wie a.equals(b) && !b.equals(a) verursachen:

java.util.Date d1 = java.sql.Date.valueOf("2012-01-01"); 
java.util.Date d2 = new java.util.Date(d1.getTime()); 
java.util.Date d3 = new java.sql.Timestamp(d1.getTime()); 

System.out.println(d1.equals(d2)); // true 
System.out.println(d2.equals(d1)); // true 
System.out.println(d1.equals(d3)); // true 
System.out.println(d3.equals(d1)); // false 
System.out.println(d2.equals(d3)); // true 
System.out.println(d3.equals(d2)); // false 
+0

Also sollte ich der Millisekunden Teil Ged befreien mit etwas wie diesem: Kalender Kalender = Calendar.getInstance(); calendar.setTime (Datum); calendar.set (Kalender.MILLISECOND, 0); – Tunaki

Verwandte Themen