如何避免过多的休眠刷新到DB

时间:2012-03-22 16:32:44

标签: java hibernate usertype

我正在使用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);
}

让所有过多的数据库更新消失。

1 个答案:

答案 0 :(得分:5)

您必须实际调试此内容才能找到答案,但我怀疑hashcode()equals()存在问题。我要检查的第一件事是在您使用Blob UserType持久化的类中实现hashcode()equals() - 确保它们一致地工作,并遵循规则 - .e.g。如果equals()在用于比较对象的“旧”和“新”状态时返回false,则会保持该状态。