我正在生成一个日期并通过 hibernate 保存在数据库中,当我获得该值时,我将其与插入之前的值进行比较。结果不相等!
我创建的日期如下
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)
为真,但 timestamp.equals(date)
为假。
我的建议:永远不要将 Date 实例与 equals()
进行比较。请改用 compareTo()
。
关于java - 如果日期相同,为什么 assertEquals 为假? hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23021648/