java - 如果日期相同,为什么 assertEquals 为假? hibernate

标签 java hibernate junit assert assertions

我正在生成一个日期并通过 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/

相关文章:

java - 应用程序启动时图像超出 imageview

java - 如何从 Java 9 模块导出所有包?

java - 检查 UTF-8 数据类型 3 字节或 4 字节 Unicode

java - 使用 Maven 命令执行特定的 JUnit 测试用例

java - 为什么 Spring TestExecution ExceptionHandler Tests 的 ATestClass 的测试不会失败?

android - 如何更改 TestEngine ID 以运行 JUnit 5?

java - 如何在Java中解析JSON

java - 如何使用 Hibernate Criteria API 从连接表中选择不同的表?

java - 如何在spring上正确地从file.properties设置hibernate?

java - Hibernate + EJB 中的容器管理事务 (CMT)