2008-03-05
关于hibernate延迟加载对象的一个问题及分析
关键字: java, hibernate
今天有个郁闷的问题,是关于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没有去查数据库)
发表评论
最近加入圈子
链接
最新评论
-
山寨了一个配合acts_as_fe ...
Quake Wang此言不差,我开始没搞清楚ruturning的用法 看到一个帖 ...
-- by yangzhihuan -
山寨了一个配合acts_as_fe ...
第6行 pager = WillPaginate::Collection.new ...
-- by Quake Wang -
山寨了一个配合acts_as_fe ...
pager在这里只是一个定义了page_total数量的数组(每个对象都是nil ...
-- by yangzhihuan -
山寨了一个配合acts_as_fe ...
pager = WillPaginate::Collection.new ...
-- by yb31 -
用上了liuqiang大侠分享的 ...
liuqiang 你上面发的那个附件跟你原来发的那个有区别吗? 如果是新的,我 ...
-- by yangzhihuan







评论排行榜