Javers 在比较 java.sql.Timestamp 和 java.util.Date 字段时显示出差异,即使没有对日期字段进行任何更改
Javers showing difference while comparing java.sql.Timestamp with java.util.Date fields even if there is no changes made to the date fields
我正在尝试使用 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());
}
}
输出:
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
手动定义它(这非常忙)。
所以
- 我想知道是否有更好的方法来避免这种变化。
- Javers 是否提供比较 2 个不同类型日期的功能(如上所述)。
- 如果 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
我正在尝试使用 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());
}
}
输出:
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
手动定义它(这非常忙)。
所以
- 我想知道是否有更好的方法来避免这种变化。
- Javers 是否提供比较 2 个不同类型日期的功能(如上所述)。
- 如果 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