Javers在比较java.sql.Timestamp和java.util.Date字段时显示差异,即使日期字段没有更改

Javers在比较java.sql.Timestamp和java.util.Date字段时显示差异,即使日期字段没有更改,java,javers,Java,Javers,我试图使用Javers比较两个VO,但由于java.sql.Timestamp和java.util.Date字段比较显示检测到更改,但实际上没有对字段进行任何更改,因此我遇到了一些困难 以下是我的设想: @Entity class A { @Id private long id; private SortedSet<B> objB; public SortedSet<B> getObjB() { return objB; } public

我试图使用Javers比较两个VO,但由于
java.sql.Timestamp
java.util.Date
字段比较显示检测到更改,但实际上没有对字段进行任何更改,因此我遇到了一些困难

以下是我的设想:

@Entity
class A {
  @Id private long id;
  private SortedSet<B> objB;

  public SortedSet<B> getObjB() {
    return objB;
  }

  public void setObjB(SortedSet<B> objB) {
    this.objB = objB;
  }
}

@Entity
class B implements comparable<B> {
  @Id private long id;
  private java.util.Date startDate;
  private java.util.Date endDate;

  public Date getStartDate() {
    return startDate;
  }

  public void setStartDate(Date startDate) {
    this.startDate = startDate;
  }


  public Date getEndDate() {
    return endDate;
  }

  public void setEndDate(Date endDate) {
    this.endDate = endDate;
  }

  equals(...) {
    ...
  }
  hashCode(...) {
    ...
  }
}

class JaversDateCompareDemo {
  public static void main(String[] args) {
    B b1= new B();
    b1.setStartDate(new java.sql.Timestamp(1559822652957));
    b1.setEndDate(new java.sql.Timestamp(1559822652957));

    SortedSet<B> s1 = new TreeSet();
    s1.add(b1);

    B b2 = new B();
    b2.setStartDate(1559822652957);
    b2.setEndDate(1559822652957);

    SortedSet<B> s2 = new TreeSet();
    s2.add(b2);

    A a1 = new A();
    a.setObjB(s1);

    A a2 = new A();
    a.setObjB(s2);

    Javers javers = JaversBuilder.javers().withListCompareAlgorithm(lca).build();
    Diff diff = javers.compare(a1, a2);
    System.out.println(diff.prettyPrint());
  }
}
我的代码库实际上非常大,我们希望有一种标准的方法来比较和维护更改的审计日志,现在我正在手动解析日期字段,从
java.sql.Timestamp
java.util.date
,无论它是在哪里定义的(这非常繁忙)

所以

  • 我想知道是否有更好的方法来避免这种变化
  • Javers是否提供了比较两个不同类型日期的功能(如上所述)
  • 如果Javers目前没有此类功能,可以将此功能添加到Javers中。我认为这在这种情况下会非常有帮助
  • 谢谢。

    JaVers使用
    equals()
    来比较值,看起来像
    java.sql.Timestamp
    不等于
    java.util.Date
    ,即使它们具有相同的值

          given:
          Timestamp t = new Timestamp(1559822652957)
          Date d = new Date(1559822652957)
    
          when:
            println d
            println t
    
          println ('d.equals(t) ' + d.equals(t))
          println ('t.equals(d) ' + t.equals(d))
    
          then:
          t.time == d.time
    
    输出

    Thu Jun 06 14:04:12 CEST 2019
    2019-06-06 14:04:12.957
    d.equals(t) true
    t.equals(d) false
    

    感谢@Bartek的及时回复。我现在看到Timestamp和Date equals()的工作方式与javadoc完全不同。这正是我的场景(t等于(d))。您对在这种情况下可以做什么有什么建议吗?否则将不得不强制转换到目前为止的每个时间戳值。谢谢。试着编写一个
    CustomComparator
    并为这两种类型注册它。
    Thu Jun 06 14:04:12 CEST 2019
    2019-06-06 14:04:12.957
    d.equals(t) true
    t.equals(d) false