我正在通过休眠生成一个日期并保存在数据库中,当我得到该值并将其与插入之前的值进行比较.结果不平等!
我创建了如下日期
Date rightnow = Calendar.getInstance().getTime(); Task t1 = new Task("My task",rightnow); taskDao.saveOrUpdate(t1); Task taskR1 = taskDao.get(t1.getIdTask()); assertEquals("They should have to be equal dates",taskR1.getDate(),t1.getDate());
我收到了这个错误
< 2014-04-11 23:13:13.0>不同于< Fri Apr 11 23:13:13 CEST 2014>
java.lang.AssertionError: They should have to be equal dates expected:<2014-04-11 23:13:13.0> but was:<Fri Apr 11 23:13:13 CEST 2014>
与问题相关的额外信息
课程任务
@Entity @Table(name = "t_task") public class Task { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "idTask") private long idTask; ... @Column(name = "date") private Date date; ...
MysqL表t_task
CREATE TABLE IF NOT EXISTS `mytask`.`t_task` ( `idTask` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,`date` DATETIME NOT NULL ...
我在Task中创建了一个新的hashCode()和equals()函数,只有日期字段,所以它是不同的.
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((date == null) ? 0 : date.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof Task)) return false; Task other = (Task) obj; if (date == null) { if (other.date != null) return false; } else if (!date.equals(other.date)) return false; return true; }
任何的想法?
解决方法
这是由java.sql.Timestamp混乱设计引起的完全混乱,并且由Hibernate返回此类的实例.实际上,您将java.util.Date实例存储到您的实体中. Hibernate将其转换为java.sql.Timestamp以将其插入数据库中.但是当它从数据库中读取数据时,它不会将时间戳转换回java.util.Date.这很好,因为Timestamp扩展了Date.
但是时间戳永远不应该延长日期.实际上,Date精确到毫秒,而Timestamp精确到纳秒.为了能够比较两个Timestamp的纳秒部分,Timestamp会覆盖equals()方法,但会通过这样做来打破它的一般契约.最终结果是,您可以将date.equals(timestamp)设置为true,但timestamp.equals(date)为false.
我的建议:永远不要将Date实例与equals()进行比较.请改用compareTo().