org.hibernate.LazyInitializationException: could not initialize proxy - the owni

LoginOut 2009-09-18 04:25:17
Action:

public Cardinfo findById(Long id) {
Session session = HibernateSessionFactory.getSession();
Transaction tx = null;
Cardinfo cinfo = null;
try {
tx = session.beginTransaction();
cinfo = (Cardinfo) session.load(Cardinfo.class, id);
tx.commit();
} catch (RuntimeException re) {
tx.rollback();
log.error("==CardinfoServices findById failed==", re);
} finally {
session.close();
}
return cinfo;
}



String cidLoad = request.getParameter("cidLoad");
Cardinfo cardinfo = cardinfoSer.findById(new Long(cidLoad));
cardinfoForm.setCardid(new Long(cidLoad));
cardinfoForm.setCardname(cardinfo.getCardname());
cardinfoForm.setPhonenum(cardinfo.getPhonenum());
cardinfoForm.setCardstate(cardinfo.getCardstate());
cardinfoForm.setOtherinfo(cardinfo.getOtherinfo());

System.out.println("oid: "
+ cardinfo.getCardownerinfo().getOwnerid());
System.out.println("oid: "
+ cardinfo.getCardownerinfo().getOwnername());


错误指向这行:
cardinfoForm.setCardname(cardinfo.getCardname());

于是修改:

public Cardinfo findById(Long id) {
Session session = HibernateSessionFactory.getSession();
Transaction tx = null;
Cardinfo cinfo = null;
try {
tx = session.beginTransaction();
cinfo = (Cardinfo) session.load(Cardinfo.class, id);
Hibernate.initialize(cinfo);
tx.commit();
} catch (RuntimeException re) {
tx.rollback();
log.error("==CardinfoServices findById failed==", re);
} finally {
session.close();
}
return cinfo;
}


程序还是报错:org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed

错误指向:
System.out.println("oid: "
+ cardinfo.getCardownerinfo().getOwnername());

这该如何解决呢?
...全文
144 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LoginOut 2009-09-21
  • 打赏
  • 举报
回复
谢谢各位,
先结贴
我在看看lzy这方面的东西
不懂在问
LoginOut 2009-09-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 archko 的回复:]
cardinfoForm.setCardname(cardinfo.getCardname());还是
cardinfo.getCardownerinfo().getOwnername());
两帖说的好像不统一啊
如果是第二句,就是关联的对象没有查到,为什么呢/
你cinfo = (Cardinfo) session.load(Cardinfo.class, id);
Hibernate.initialize(cinfo);根本没有作用,因为load加载了Cardinfo但它没有加载Cardownerinfo所以不可能得到ownername(many-to-one 如果lazy没有设置或是设为true)
你应该是Hibernate.initialize(cinfo.getOwnerinfo());

如果是第一句,不至于这样吧.查询它本身也会出错?LOAD先加载ID,如果只要ID的话,就不会再加载其它的.但如果有需要其它属性,应该也会查出的啊
[/Quote]


我在好好想想

[Quote=引用 4 楼 andesen 的回复:]
finally {
            session.close();
        }
你都把session关闭了,怎么会延迟加载呢?
[/Quote]

用完了session不是应该就要关闭的吗?
andesen 2009-09-19
  • 打赏
  • 举报
回复
finally {
session.close();
}
你都把session关闭了,怎么会延迟加载呢?
youjianbo_han_87 2009-09-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 archko 的回复:]
cardinfoForm.setCardname(cardinfo.getCardname());还是
cardinfo.getCardownerinfo().getOwnername());
两帖说的好像不统一啊
如果是第二句,就是关联的对象没有查到,为什么呢/
你cinfo = (Cardinfo) session.load(Cardinfo.class, id);
            Hibernate.initialize(cinfo);根本没有作用,因为load加载了Cardinfo但它没有加载Cardownerinfo所以不可能得到ownername(many-to-one 如果lazy没有设置或是设为true)
你应该是Hibernate.initialize(cinfo.getOwnerinfo());

如果是第一句,不至于这样吧.查询它本身也会出错?LOAD先加载ID,如果只要ID的话,就不会再加载其它的.但如果有需要其它属性,应该也会查出的啊
[/Quote]

是这个问题,其实hibernate先把lazy全部都取消掉,然后再慢慢设置,在实践,这样学习的会更快。
archko 2009-09-18
  • 打赏
  • 举报
回复
cardinfoForm.setCardname(cardinfo.getCardname());还是
cardinfo.getCardownerinfo().getOwnername());
两帖说的好像不统一啊
如果是第二句,就是关联的对象没有查到,为什么呢/
你cinfo = (Cardinfo) session.load(Cardinfo.class, id);
Hibernate.initialize(cinfo);根本没有作用,因为load加载了Cardinfo但它没有加载Cardownerinfo所以不可能得到ownername(many-to-one 如果lazy没有设置或是设为true)
你应该是Hibernate.initialize(cinfo.getOwnerinfo());

如果是第一句,不至于这样吧.查询它本身也会出错?LOAD先加载ID,如果只要ID的话,就不会再加载其它的.但如果有需要其它属性,应该也会查出的啊
zidasine 2009-09-18
  • 打赏
  • 举报
回复
查看下关于hibernate检索策略的文章
不知道你是怎么关联的
只设置关联级别的lazy=false不一定起作用 还要看对方类级别的lazy
LoginOut 2009-09-18
  • 打赏
  • 举报
回复

错误指向这行:
cardinfoForm.setCardname(cardinfo.getCardname());

为什么我将这个POJO对应的hbm.xml设置 lazy="false"也不行

67,513

社区成员

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

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