请教hibernate的lzay问题!关于懒加载的子类。谢谢。

luoxiang2000 2008-02-22 04:06:26
比如,有一个用户类UserBean,SuperUserBean1、SuperUserBean2继承自UserBean.然后有一个货品类GoodsBean包含一个UserBean,而且是懒加载的.如下:
UserBean {
String id;
String name;
}

SuperUserBean1 extends UserBean {
String xxx1;
}

SuperUserBean2 extends UserBean {
String xxx2;
}

GoodsBean {
String id;
UserBean ub;
}

现在取出一个id=01的GoodsBean的时候,其实际对应的不是一个UserBean用户,而是SuperUserBean1或者 SuperUserBean2,但是默认取出来的相应用户是一个UserBean,这个时候就得不到xxx1或者xxx2属性,不知道要怎么搞?
就算我知道返回的应该是一个SuperUserBean1,也不能调用((SuperUserBean1)goodsbean.getUb()).getXxx1();会跑出异常ClassCastException。
如果是lazy="false"的话,就会自动取出当前GoodsBean的对应的SuperUserBean1或者SuperUserBean2。

哪位知道要怎么解决阿,谢谢了!
...全文
192 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoxiang2000 2008-02-22
  • 打赏
  • 举报
回复
谢谢。我取数据的过程中并没有使用事务。每次都要生成特殊的hql语句太麻烦了。
forestking_xx 2008-02-22
  • 打赏
  • 举报
回复
错了.是from GoodsBean
forestking_xx 2008-02-22
  • 打赏
  • 举报
回复
你取出goodsBean以后在同一个transaction中调用了Hibernate.initialize吗?
还有一个办法,就是使用Hql或者Criteria,比如:from GOODSBEAN_TABLE goodsBean left jion fetch goodsBean.ub
你试试看
luoxiang2000 2008-02-22
  • 打赏
  • 举报
回复
Hibernate.initialize(goodsBean.getUd())这个我早就试过了,不起作用。我的session不关也是这样
forestking_xx 2008-02-22
  • 打赏
  • 举报
回复
initialize也必须在transaction中被调用。
forestking_xx 2008-02-22
  • 打赏
  • 举报
回复
这个问题是因为hibernate在去除GoodsBean对应的userbean时并不是取出真正的userBean,甚至就不是userBean,也不是他的子类,而是他动态生成的proxy,这个就是为什么处产生classCastException的原因。prxoy只包含id。在transaction里调用其他属性,可以得到一个初始化后的实例。
有以下几个办法可以试试:
1 用String id = goodsbena.getUb().getId();然后用这个id去真正正的get()一个UserBean.
2 Hibernate 提供了一个静态方法初始化,比如Hibernate.initialize(goodsBean.getUd());以后就可以正常使用了。
luoxiang2000 2008-02-22
  • 打赏
  • 举报
回复
可是如果我不用懒加载,也就是lazy=false,hibernate会直接返回SuperUserBean1对象阿
老紫竹 2008-02-22
  • 打赏
  • 举报
回复
实际对应的不是一个UserBean用户,而是SuperUserBean1或者 SuperUserBean2

你是怎么保证的?这取决于你的数据库结构了。 hibernate 在重新从数据库读取数据的时候,只会生成UserBean, 他可不知道你要的是1,还是2
老紫竹 2008-02-22
  • 打赏
  • 举报
回复
UserBean 里面根本就没有 xxx1 和 xxx2

而且父类不能转化为子类,所以你的问题没办法解决,谁让你用 UserBean父类呢!

另,既然你的GoodsBean只关心UserBean, 你为何要xxx1和xxx2呢,这是自相矛盾的设计!

把xxx1和xxx2 放到 UseBean里面算了。

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧