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

我正在使用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,则会保持持久性.

上一篇:ORM之SQLAlchemy


下一篇:如何集成Joda-Time和Hibernate 4 / MySQL 5?