Environment:
- MySql 5.6.14
- Spring MVC
- Hibernate
I'm having problems to check if 2 objects are equal, and the problem is caused by de variable Date.
I'm using Hibernate and it seems to be the problem of Timestamp (nanoseconds) and Date(miliseconds).
When I create the object Task date is different that when I retreived the object from database.
java.util.Date date = new java.util.Date();
java.sql.Date datesql = new java.sql.Date(date.getTime());
java.util.Date stamp = new java.sql.Timestamp(date.getTime());
Date rightnow = stamp;//Calendar.getInstance().getTime();
Task t1 = new Task("My first task", "This is a task", rightnow,
rightnow, category, priority, state, user, user, "okey", 0);
Task t2 = new Task("My second task", "This is a task", date,
rightnow, category, priority, state, user, user, "okey", 0);
Task t3 = new Task("My third task", "This is a task", datesql,
rightnow, category, priority, state, user, user, "okey", 0);
taskDao.saveOrUpdate(t1);
taskDao.saveOrUpdate(t2);
taskDao.saveOrUpdate(t3);
taskDao.saveOrUpdate(t4);
List<Task> tasks = taskDao.getAllTasks();
assertEquals("Should be 4 tasks.", 4, tasks.size());
Task taskR1 = taskDao.get(t1.getIdTask());
Task taskR2 = taskDao.get(t2.getIdTask());
Task taskR3 = taskDao.get(t3.getIdTask());
//Dates before saving objects in database
System.out.println("l timestamp> "+rightnow.getTime());
System.out.println("l date > "+date.getTime());
System.out.println("l datesql > "+datesql.getTime());
//Dates from retrieved objects
System.out.println("l tr1date > "+taskR1.getDate().getTime());
System.out.println("l tr2date > "+taskR2.getDate().getTime());
System.out.println("l tr3date > "+taskR3.getDate().getTime());
Results of this code
//Dates before saving objects in database
l timestamp> 1401298705937
l date > 1401298705937
l datesql > 1401298705937
//Dates from retrieved objects
l tr1date > 1401298706000
l tr2date > 1401298706000
l tr3date > 1401298706000
The problem is that when compare 1401298705937 (Date before saving object) and 1401298706000(Date after saving object) are different.
I've also tried with compareTo and equals functions
System.out.println("t3.getDate().compareTo(taskR3.getDate()) == 0 :"
+ (t3.getDate().compareTo(taskR3.getDate()) == 0));
System.out.println("t3.getDate().equal(taskR3.getDate()) == 0 :"
+ (t3.getDate().compareTo(taskR3.getDate()) == 0));
System.out.println("taskR3.getDate().compareTo(t3.getDate()) == 0 :"
+ (t3.getDate().compareTo(taskR3.getDate()) == 0));
System.out.println("taskR3.getDate().equal(t3.getDate()) == 0 :"
+ (t3.getDate().compareTo(taskR3.getDate()) == 0));
And result is false, as well with objects t1, t2 and taskR1, taskR2.
t3.getDate().compareTo(taskR3.getDate()) == 0 :false
t3.getDate().equal(taskR3.getDate()) == 0 :false
taskR3.getDate().compareTo(t3.getDate()) == 0 :false
taskR3.getDate().equal(t3.getDate()) == 0 :false
Any ideas?