关于在Hibernate里进行lazy load时返回的对象类型问题,觉得很奇怪
(一)有两个类:
class Shape {
}
class Rectangle extends Shape {
}
(二)在XML中配置为继承关系:略。
(三)单元测试代码:
public void testLoad() {
Session session = null;
try {
session = HibernateUtil.getSession();
Object o = session.load(Shape.class, 1); // 通过Eclipse观察,此时的o的类型非常奇怪,如Shape$$Enhancer.....@fdafdsa之类的。问题就在这里:o引用的实际类型到底是Shape类型,还是Shape的代理的类型,而这两者之间又有什么关系,是继承关系吗?
if (o instanceof Shape) { // 为什么会进到这里面?
System.out.println( "a shape ");
}else {
System.out.println( "not a shape! ");
}
}catch(Exception e) {
e.printStackTrace();
}finally {
HibernateUtil.closeSession(session);
}
}
问题在代码的注释当中,这个问题困扰我很久了,请各位出招答疑解惑,谢谢。
[解决办法]
我觉得你写的代码有点问题,首先你的类里面没有字段和get,set方法。你在load的时候不可能传一个1去获得对象的吧。
假设那些都有,你的hibernate要Load的话,应该有相应的数据库吧。
load出来的类肯定不是代理类,因为那没有必要,代理类代理的真实类必须是有业务操作的,但是load出来的是实体类,是与数据库中字段映射的类。那有必要代理么?
不过对于延迟加载我没怎么研究过,所以不是很明白,只是知道它们是先建立关系,然后需要数据的时候再从数据库读取数据的一种方式。
[解决办法]
<class lazy= "true ">
session.load(类名,id号)查询时,返回 代理类实例
session.get(类名,id号) 与 hql查询时,返回直接返回实例(不是代理类实例),并忽略延迟加载。
[解决办法]
差下 API
load(Class theClass, Serializable id)
Return the persistent instance of the given entity class with the given identifier, assuming that the instance exists.
我认为是你的Class theClass是什么 LOAD得到的就是什么类型
Object o = session.load(Shape.class, 1)(没有进行强制转型 o还是 Object)
if (o instanceof Shape)
定义一个超类 使用instanceof 我没试过 不过我觉得应该 有些不妥
还有instanceof保持了类型的概念 指 你是这个类 或者你是这类的派生类? 继承包括其中 就算你使用Rectangle instanceof Shape 返回也是true
要考虑继承的话 用equals or ==
if(o.getClass()equals.(Shape.class)) or if (o.getClass == Shaps.class)判断
[解决办法]
Object o = session.load(Shape.class, 1);if (o instanceof Shape)这个没有问题的 我把 问题想复杂了
看这个例子
class Instanceofdemofather
{
}
class Instanceofdemo extends Instanceofdemofather
{
public static void main(String[] args)
{
Object o = new Instanceofdemo();
Instanceofdemo i = new Instanceofdemo();
//if(o instanceof Instanceofdemofather){
if(o.getClass() == Instanceofdemofather.class){
System.out.println( "yes ");
}
else{
System.out.println( "no ");
}
}
}
[解决办法]
o instanceof Instanceofdemofather
这个类的实例,或者这个类的子类的实例,都返回 true 吧
[解决办法]
Object o = session.load(Shape.class, 1); // 通过Eclipse观察,此时的o的类型非常奇怪,如Shape$$Enhancer.....@fdafdsa之类的。问题就在这里:o引用的实际类型到底是Shape类型,还是Shape的代理的类型,而这两者之间又有什么关系,是继承关系吗?
==============================================================================
用这个 o.getClass().getSuperclass(),如果反回的是Shape,那就是继承了