Java 是否有必要在Hibernate的hashcode实现中为代理对象使用getter?

Java 是否有必要在Hibernate的hashcode实现中为代理对象使用getter?,java,hibernate,jpa,Java,Hibernate,Jpa,我知道for equals方法的实现应该是这样的,以避免在Hibernate返回代理对象时出现问题 @覆盖 公共布尔等于(对象o){ 如果(this==o)返回true; 如果(!(父对象的实例))返回false; 父父=(父)o; 返回getName()!=null?getName().equals(parent.getName()):parent.getName()==null; } 我需要使用instanceof。(如果我比较likegetClass()!=o.getClass()则代

我知道for equals方法的实现应该是这样的,以避免在Hibernate返回代理对象时出现问题

@覆盖
公共布尔等于(对象o){
如果(this==o)返回true;
如果(!(父对象的实例))返回false;
父父=(父)o;
返回getName()!=null?getName().equals(parent.getName()):parent.getName()==null;
}
  • 我需要使用
    instanceof
    。(如果我比较like
    getClass()!=o.getClass()
    则代理对象o始终为真)
  • 我必须使用getter加载代理对象,否则字段将为
    null
但我还想知道,对于
hashcode
实现来说,这是否正确,我应该使用getter来考虑代理对象吗

我是否应该这样实施:

public int hashCode(){
返回getName().hashCode();
}
或者也可以这样实施:

public int hashCode(){
返回name.hashCode();
}
注意:假设名称为非空字段。

Hibernate文档:

希望在JPA提供商之间保持可移植性的应用程序应遵守以下要求:

实体的持久状态由实例变量表示,这些变量可能对应于JavaBean样式的属性。实例变量只能由实体实例本身从实体的方法中直接访问。只有通过实体的访问器方法(getter/setter方法)或其他业务方法,客户端才能使用实体的状态

然而,Hibernate的要求并不那么严格。与上述列表的差异包括:

Hibernate不限制应用程序开发人员公开实例变量并从实体类本身外部引用它们。然而,这样一种范式的有效性充其量是有争议的

以及:

属性(无论是字段还是getter/setter)不需要声明为公共的。Hibernate可以处理用public、protected、package或private可见性声明的属性。同样,如果希望使用运行时代理生成进行延迟加载,getter/setter应该至少授予对包可见性的访问权

因此,我看不到实体内部对实例变量访问的任何限制。但是,无论如何,我建议您对
equals/hashCode
实现使用一致的方法