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

its*_*dok 4 java hibernate usertype

我正在使用Play Framework,将Hibernate作为JPA提供程序,我注意到如果一个实体有一个Blob成员,它总会被刷新到DB,即使我没有更改任何内容,即使我不要阅读Blob的价值.

Blob是Play中定义的UserType.这是源代码.该类的基本思想是将实际数据保存在文件系统中,并仅在DB表中保存指针(UUID).

这个SO答案中,我认为Blob代码中的某些内容必须在从DB加载的时间和Hibernate检查它的时间之间进行更改.还有这个答案表明它可能是别的东西.

如果不进行更改,如何更改Blob类以避免数据库刷新?


GreyBeardedGeek的回答证明是正确的.当前equals实现仅在具有相同标识的对象上返回true,并且始终在null上返回false.

改变这个:

public boolean equals(Object o, Object o1) throws HibernateException {
    return o == null ? false : o.equals(o1);
}
Run Code Online (Sandbox Code Playgroud)

对此:

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);
}
Run Code Online (Sandbox Code Playgroud)

使得所有过多的DB更新都消失了.

Gre*_*eek 5

你得实际调试这一找出来,但我怀疑有问题hashcode()equals().我会检查的第一件事是执行hashcode()equals()在你与斑点的UserType坚持类-确保他们一致地工作,并遵守规则-如果.eg equals()当它被用来比较'返回false你的对象的旧'和'新'状态,它会被持久化.