今天有个郁闷的问题,是关于hibernate的model的equals 方法的.
Hibernate的延迟加载对象是经过cglib进行增加的.
以下代码会出现问题:
getClass()的值是:com.model.Test.
obj.getClass()的值则为: com.model.Test$$EnhancerByCGLIB$$3b047fc7
也就是说两个对象的类是不一样的,结果会返回false
如果传入来的 obj对象是延迟加载的话,并且还没有调用过任务的get 方法,就会出现问题了,关键就在这里,
代码:
Id的值是:100(你的返回值可能会有所不同),但是other.id的返回值是null
这是因为在hibernate时面是认get方法去查数据库的,所以other.id的返回值是null(由于还没有调用过任何的get方法,hibernate没有去查数据库)
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Test other = (Test) obj;
if (id == null) {
if (other.id != null) {
return false;
}
} else if (!id.equals(other.id)) {
return false;
}
return true;
}
Hibernate的延迟加载对象是经过cglib进行增加的.
以下代码会出现问题:
if (getClass() != obj.getClass()) {
return false;
}
getClass()的值是:com.model.Test.
obj.getClass()的值则为: com.model.Test$$EnhancerByCGLIB$$3b047fc7
也就是说两个对象的类是不一样的,结果会返回false
如果传入来的 obj对象是延迟加载的话,并且还没有调用过任务的get 方法,就会出现问题了,关键就在这里,
代码:
!id.equals(other.id)
Id的值是:100(你的返回值可能会有所不同),但是other.id的返回值是null
这是因为在hibernate时面是认get方法去查数据库的,所以other.id的返回值是null(由于还没有调用过任何的get方法,hibernate没有去查数据库)