这已经讨论了很多(例如here和there),对我而言,使用" business"为Hibernate实体实现hashCode方法时的键,如:
public class User {
private String username;
...
@Override
public int hashCode() {
//Calculate on base of username
}
}
这比在hibernate生成ID的情况下使用ID更好(对于新实体,它将为null)。
如果实体由"虚拟"只加载延迟属性?
我可以根据它们计算hashCode,并且到目前为止已经完成了。现在我遇到的问题是,当调用hashCode()
时,会话被关闭,因此无法再访问延迟加载的属性。在这种情况下该怎么办?
答案 0 :(得分:1)
默认情况下,如果我正在对实体进行代码审查,我会要求程序员使equals()
和hashcode()
不依赖于延迟加载的属性。感觉像是equals()
和hashcode()
方法成功或失败的抽象失败取决于hibernate的会话状态。毕竟,如果其业务密钥不可用,那么它不是一个干净的对象,只不过主键不可用。
我建议热切地提取相关属性。在极少数情况下,您可以使用@Formula
hibernate注释来获取必要的字段作为派生属性来计算equals
和hashcode
。