2012-10-13 14 views
5

Ho una semplice classe di entità che ha una proprietà Date. Questa proprietà corrisponde a una colonna datetime di MySQL.Data persistita nel database non uguale alla data recuperata

@Entity 
public class Entity { 

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

} 

Questo è ciò che un test di integrazione ho scritto assomiglia:

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); 

mi aspetterei quelle due date per essere uguali ma non lo sono! In realtà, ho:

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

quindi c'è un piccolo spazio tra le due date. Mi sto davvero chiedendo da dove possa venire questo gap. Non è sempre lo stesso e varia ogni volta che avvio il processo di test. Nel mio database, la data memorizzata è 2012-10-13 22: 15: 38.0.

Ho davvero bisogno di cancellare millisecondi da qualche parte?

risposta

3

Dal MySQL documentation:

Un valore DATETIME o TIMESTAMP può includere un frazionaria secondi parte finale fino a microsecondi (6 cifre) precisione. Sebbene questa parte frazionaria venga riconosciuta, viene scartata dai valori memorizzati nelle colonne DATETIME o TIMESTAMP. Per informazioni sul supporto frazionale di secondi in MySQL, consultare la Sezione 11.1.5.6, "Secondi frazionari nei valori temporali ".

Si noti che non si dovrebbe usare equivale a confrontare in ogni caso date, perché le varie sottoclassi Data hanno implementazioni buggy, che causano problemi come a.equals(b) && !b.equals(a):

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

quindi dovrei Ged liberarsi della parte millisecondi con qualcosa del genere: Calendar calendar = Calendar.getInstance(); calendar.setTime (date); calendar.set (Calendar.MILLISECOND, 0); – Tunaki

Problemi correlati