2015-12-07 33 views
0

这已被讨论了很多(如herethere)和我使用“企业”键实现对Hibernate实体,如哈希码法时,听起来很有用:实施的hashCode和延迟加载

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

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

如果一个实体仅包含“虚拟”延迟加载的属性,该怎么办? 我可以计算基于它们的hashCode,并做到目前为止。现在我遇到了这样的问题:当调用hashCode()时,会话被关闭,所以懒惰加载的属性不能再被访问。在这种情况下该怎么办?

回答

1

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

我会建议急于提取相关属性。在一些极少数情况下,您可以使用hibernate批注中的@Formula来获取必要的字段作为派生属性,以计算equalshashcode