【问题标题】:How to avoid excessive hibernate flushes to DB如何避免过多的休眠刷新到数据库
【发布时间】: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);
}

消除了所有过多的数据库更新。

【问题讨论】:

    标签: java hibernate usertype


    【解决方案1】:

    您必须实际调试才能找出答案,但我怀疑hashcode()equals() 存在问题。我要检查的第一件事是 hashcode()equals() 在您坚持使用 Blob UserType 的类中的实现 - 确保它们始终如一地工作,并遵守规则 - 例如。如果 equals() 在用于比较对象的“旧”和“新”状态时返回 false,它将被持久化。

    【讨论】:

    • 我会检查它,但我明确链接的第一个答案说“重要的是要注意 Hibernate 的脏检查独立于方法 equals/hascode。Hibernate 不查看这些方法全部”
    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多