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没有去查数据库)
发表评论
- 浏览: 759 次
- 性别:


- 详细资料
搜索本博客
最近加入圈子
最新评论
-
对于model是全部放在mode ...
pig345 写道如果问题是: liusong1111 写道 class A ...
-- by liusong1111 -
对于model是全部放在mode ...
不过migrate无法支持按模块创建目录,所有的migratee都会放在一个db ...
-- by blogbin -
对于model是全部放在mode ...
2.0已经有了命名空间,例如: ruby script/generate m ...
-- by magicgod -
对于model是全部放在mode ...
我测试了一下,还有一个model不放在根下,要求跟control,helper的 ...
-- by lllyq -
对于model是全部放在mode ...
希望rails能把controller分成两类:1,主表维护2,业务操作
-- by carlosbdw






评论排行榜