我正在使用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);
}
使得所有过多的DB更新都消失了.
解决方法:
您必须实际调试此内容才能找到,但我怀疑hashcode()和equals()存在问题.我要检查的第一件事是在您使用Blob UserType持久化的类中实现hashcode()和equals() – 确保它们一致地工作,并遵循规则 – .e.g.如果equals()在用于比较对象的“旧”和“新”状态时返回false,则会保持持久性.