我正在使用Play Framework,Hibernate作为JPA提供程序,我注意到如果一个实体有一个Blob成员,它总会被刷新到DB,即使我没有更改它中的任何内容,即使我没有阅读Blob的价值。
Blob是Play中定义的UserType。 Here's the source code。该类的基本思想是将实际数据保存在文件系统中,并仅在DB表中保存指针(UUID)。
从this SO answer开始,我认为Blob代码中的某些内容必须在从DB加载的时间和Hibernate检查它的时间之间进行更改。还有this answer表明它可能是其他东西。
如果没有进行任何更改,如何更改Blob类以避免数据库刷新?
GreyBeardedGeek的回答证明是正确的。当前equals实现仅在具有相同标识的对象上返回true,并且始终在null上返回false。
更改此内容:
public boolean equals(Object o, Object o1) throws HibernateException {
return o == null ? false : o.equals(o1);
}
到此:
private static boolean equal(Object a, Object b) {
return a == b || (a != null && a.equals(b));
}
public boolean equals(Object a, Object b) throws HibernateException {
if(a instanceof Blob && b instanceof Blob) {
return equal(((Blob)a).UUID, ((Blob)b).UUID) &&
equal(((Blob)a).type, ((Blob)b).type);
}
return equal(a, b);
}
让所有过多的数据库更新消失。
答案 0 :(得分:5)
您必须实际调试此内容才能找到答案,但我怀疑hashcode()
和equals()
存在问题。我要检查的第一件事是在您使用Blob UserType持久化的类中实现hashcode()
和equals()
- 确保它们一致地工作,并遵循规则 - .e.g。如果equals()
在用于比较对象的“旧”和“新”状态时返回false,则会保持该状态。