我正在使用 Play Framework,Hibernate 作为 JPA 提供者,我注意到如果一个实体有一个 Blob 成员,它总是会被刷新到数据库,即使我没有改变它,并且即使我没有读取 Blob 的值。
Blob 是 Play 中定义的 UserType。 Here's the source code .该类的基本思想是在文件系统中保存实际数据,而在DB表中只保存一个指针(一个UUID)。
来自 this SO answer ,我收集到 Blob 代码中的某些东西必须在它从数据库加载的时间和 Hibernate 检查它的时间之间进行更改。还有 this answer这表明它可能是别的东西。
如果不做任何更改,如何更改 Blob 类以避免 DB 刷新?
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);
}
消除了所有过多的数据库更新。
最佳答案
您必须实际调试才能找出答案,但我怀疑 hashcode()
和 equals()
有问题。我要检查的第一件事是 hashcode()
和 equals()
在您坚持使用 Blob UserType 的类中的实现 - 确保它们有效始终如一,并遵守规则 - 例如如果 equals()
在用于比较对象的“旧”和"new"状态时返回 false,它将被持久化。
关于java - 如何避免过多的 hibernate 刷新到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9826567/