Java Hibernate代理N + 1等于Id不绑定?

时间:2016-10-12 13:29:01

标签: java hibernate proxy fetch equals

我有一个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。

0 个答案:

没有答案