实现hashCode和延迟加载

时间:2015-12-07 17:44:51

标签: java hibernate equals hashcode

这已经讨论了很多(例如herethere),对我而言,使用" business"为Hibernate实体实现hashCode方法时的键,如:

public class User {
    private String username;
    ...
    @Override
    public int hashCode() {
        //Calculate on base of username
    }
}

这比在hibernate生成ID的情况下使用ID更好(对于新实体,它将为null)。

如果实体由"虚拟"只加载延迟属性? 我可以根据它们计算hashCode,并且到目前为止已经完成了。现在我遇到的问题是,当调用hashCode()时,会话被关闭,因此无法再访问延迟加载的属性。在这种情况下该怎么办?

1 个答案:

答案 0 :(得分:1)

默认情况下,如果我正在对实体进行代码审查,我会要求程序员使equals()hashcode()不依赖于延迟加载的属性。感觉像是equals()hashcode()方法成功或失败的抽象失败取决于hibernate的会话状态。毕竟,如果其业务密钥不可用,那么它不是一个干净的对象,只不过主键不可用。

我建议热切地提取相关属性。在极少数情况下,您可以使用@Formula hibernate注释来获取必要的字段作为派生属性来计算equalshashcode