Javers показывает разницу при сравнении java.sql.Timestamp с полями java.util.Date, даже если в поля даты не было внесено никаких изменений - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь сравнить два VO, используя Javers, но, тем не менее, у меня возникают некоторые трудности из-за сравнения полей 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());
  }
}

Вывод:

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 до java.util.Date вручную, где бы он ни был определен (что очень беспокойно).

Итак

  1. Я хочу знать, есть ли лучший способ избежать такого рода изменений.
  2. Предоставляет ли Javers возможность сравнивать 2 даты другого типа (как упомянуто выше).
  3. Если естьэта функция недоступна в настоящее время с Javers, можно ли добавить эту функцию к нему.Я думаю, что это было бы очень полезно в таких сценариях.

Спасибо.

1 Ответ

0 голосов
/ 07 июня 2019

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

output

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