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

时间:2019-06-06 12:49:35

标签: java javers

我正在尝试使用Javers比较两个VO,但是由于java.sql.Timestampjava.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());
  }
}

输出:

Diff:
* changes on A/xxx :
  - 'objB/xxx.endDate' value changed from '2019-06-06 12:04:12.976' to 'Thu Jun 06 12:04:12 GMT 2019'
  - 'objB/xxx.startDate' value changed from '2019-06-06 12:04:12.976' to 'Thu Jun 06 12:04:12 GMT 2019'

我的代码库实际上非常大,我们希望有一种标准的方法来比较和维护更改的审核日志,而事实是,当前我正在将日期字段从java.sql.Timestamp解析为{{1} }手动定义(非常忙)。

所以

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

谢谢。

1 个答案:

答案 0 :(得分:0)

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