【发布时间】:2012-04-07 06:25:00
【问题描述】:
我正在使用 Play Framework,Hibernate 作为 JPA 提供程序,我注意到如果一个实体有一个 Blob 成员,它总是会刷新到数据库中,即使我没有更改任何内容,并且即使我没有读取 Blob 的值。
Blob 是 Play 中定义的 UserType。 Here's the source code。该类的基本思想是将实际数据保存在文件系统中,在DB表中只保存一个指针(一个UUID)。
从this SO answer 得知,Blob 代码中的某些内容必须在从数据库加载到 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);
}
消除了所有过多的数据库更新。
【问题讨论】: