加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如果assertEquals是相同的日期,为什么这是假的?过冬

发布时间:2020-12-14 16:37:12 所属栏目:Java 来源:网络整理
导读:我正在通过休眠生成一个日期并保存在数据库中,当我得到该值并将其与插入之前的值进行比较.结果不平等! 我创建了如下日期 Date rightnow = Calendar.getInstance().getTime();Task t1 = new Task("My task",rightnow);taskDao.saveOrUpdate(t1);Task taskR1
我正在通过休眠生成一个日期并保存在数据库中,当我得到该值并将其与插入之前的值进行比较.结果不平等!

我创建了如下日期

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().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读