java - 如何避免过多的 hibernate 刷新到数据库

标签 java hibernate usertype

我正在使用 Play Framework,Hibernate 作为 JPA 提供者,我注意到如果一个实体有一个 Blob 成员,它总是会被刷新到数据库,即使我没有改变它,并且即使我没有读取 Blob 的值。

Blob 是 Play 中定义的 UserType。 Here's the source code .该类的基本思想是在文件系统中保存实际数据,而在DB表中只保存一个指针(一个UUID)。

来自 this SO answer ,我收集到 Blob 代码中的某些东西必须在它从数据库加载的时间和 Hibernate 检查它的时间之间进行更改。还有 this answer这表明它可能是别的东西。

如果不做任何更改,如何更改 Blob 类以避免 DB 刷新?


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);
}

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

最佳答案

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

关于java - 如何避免过多的 hibernate 刷新到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9826567/

相关文章:

Java访问Shell文件夹

java - MIDI 音序器停止而不冲洗

java - Lucene 5.2.1 中的更改分数

java - 与 hibernate 合并导致脏对象错误

spring - TransactionTemplate 与 @Transactional(propagation = Propagation.REQUIRES_NEW)

hibernate - 如何在 Hibernate 4.x 中使用 JodaTime Instant(时间戳)(通过 Jadira 用户类型)?

mysql - 如何集成 Joda-Time 和 Hibernate 4/MySQL 5?

java - 使用 Java 创建 Android 应用程序很困难

c# - 在流畅的 NHibernate SubclassMap 中映射多列用户类型的正确方法是什么?

java - 如何提高应用程序的性能