java吧 关注:1,270,489贴子:12,775,978
  • 11回复贴,共1

Hibernate 延时加载的问题

只看楼主收藏回复

// Customerserviceonline 有一个属性是terminal类的对象,是LAZY加载对象
Customerserviceonline customerserviceonline = customerserviceonlineService.get(serviceid);
terminal = customerserviceonline.getTerminal();
然后这里获取到是一个null值,
hibernate的get不应该是会自动获得实体对象吗
但是如果用spring的事务管理的HibernateTransactionManager就不会出错
后来我又在这段代码前后后面单独open了session,也还是报错了
求解为什么会get不到实体对象
ps:我知道SSH框架很旧了,你们不要提醒我了


IP属地:浙江1楼2017-07-18 15:22回复
    那么问题来了 你有这个serviceid对应的对象没


    IP属地:山西来自iPhone客户端2楼2017-07-18 16:22
    收起回复
      2025-07-22 10:11:56
      广告
      不感兴趣
      开通SVIP免广告
      这就是延迟加载和立即加载,延迟加载是你要用到这个对象的属性对象才会发送,没有就是为null,立即加载是把属性对象一起查出来,


      IP属地:广东3楼2017-07-19 17:26
      收起回复
        你也可以在调用它的iterator(),size(),isEmpty()或contains()方法:
        Customer对象的orders属性引用的集合代理类实例;
        Set orders = customer.getOrders()
        Iterator it = orders.Iterator();//导致orders集合代理类实例被初始化
        调用iterator(),size(),isEmpty()或contains()方法:也可以初始化属性对象


        IP属地:广东4楼2017-07-19 17:28
        回复
          所以一般都是用hql语句查,不用关联关系


          IP属地:广东5楼2017-07-19 17:29
          收起回复
            最近一直在写代码,没有来得回,就是我这个地方奇怪的是,如果把这一整个方法,放在spring的事务管理里面的话就会获得到Terminal对象,可是get方法不需要事务管理啊


            IP属地:浙江来自iPhone客户端6楼2017-07-20 00:18
            收起回复
              hibernate感觉灵活性还是差了点,后面复杂的还是用createsql语句做嵌套查询


              IP属地:浙江来自iPhone客户端7楼2017-07-20 00:22
              回复
                今天又碰到了这个问题,不过总算明白了原因,是因为我获得的Terminal其实是一个代理对象,这个对象如果传出了session就是一个属性都为空的空对象,而如果给它一个session包围起来,那么在这个session里,它就能通过hibernate的延迟加载获得对象的属性


                IP属地:浙江来自iPhone客户端8楼2017-07-28 16:30
                回复