我有一个Object->等于这样的实现我不知道它可能是最好的实现,但这是我们的遗留方法。
@Override
public boolean equals(final Object obj){
if(this == obj){
return true;
}
if(obj == null){
return false;
}
if(!getClass().isAssignableFrom(obj.getClass())){//this maybe buggy i know
return false;
}
final IdClass other = (IdClass)obj;
return Objects.equals(this.id,other.id);
}
IdClass是一个抽象类
public abstract class IdClass
{
private Integer id;
public IdClass(){}
public IdClass(Integer id){super();this.id = id;}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "ID", unique = true, nullable = false,updatable=false)
public Integer getId(){return this.id;}
public void setId(Integer id){this.id = id;}
}
所有模型都延伸了它。我有两个问题
1)。怎么叫这个?我的意思是我已经看到在equals对象中我也认为在compareTo方法中我可以访问字段,即使是私有这样的东西
return Objects.equals(this.id,other.id);
我可以访问 other.id 方法,即使当它是私有的当然不是同一个类我的意思是除了IdClass之外我不能但这个行为调用如何有一个名字?< / em>的
2)。我们正面临一个我们的代码的错误,当我有这样的东西时我不明白
final School school = new School(13);
final Student student = loadStudentWithCriteria();
final School proxySchool = student.getSchool();//generates N+1 Hibernate i mean generates a select to retrieve it proxySchool is in fact a proxy.
System.out.println(proxySchool.getId());//returns 13.
我们测试像这样的对象
final boolean equals = proxySchool.equals(school);//return true.
final boolean notEquals = school.equals(proxySchool);//return false;
当然,由于它们不对称,因此与等于合同的打破。</ p>
但我调试代码,我发现代码的这一行中的代理返回null。
return Objects.equals(this.id,other.id);//other.id returns null.
即使Netbeans构建该代码也很奇怪。。
但是这会返回示例中的值13
return Objects.equals(this.id,other.getId());//other.getId() returns 13.
现在equals方法是对称的。
但我的问题是为什么当 other.getId()返回13时 other.id 返回null,当学校对象直接在db中检索或被提取时,它可以正常工作学生使用或createCriteria或createAlias或setFetchMode但在Hibernate中检索时n + 1为null。