could not initialize proxy - no Session] with root cause错误 关于hibernate的get和load方法
出现这个
org.hibernate.LazyInitializationException: could not initialize proxy - no Session] with root cause错误
出现这个问题,是因为我在dao层,用hibernate的load方法,获得一个实体对象,然后把这个实体对象给service使用(我是ssh结构)
这里我们就需要说说或hibernate的get和load方法了,他们都属于延迟加载,但是他们是有区别的
首先我们看看load方法
如以下代码
ShopInformation load = hibernateTemplate.load(ShopInformation.class, shopid);以上代码使用了load方法获得了一个对象
但是,这个对象是一个代理对象,他里面只保存了id的值,而且在eclipse的控制台没有显示任何的sql语句
我们可以这里来验证
输入以下代码
System.out.println(sif1.getShopid());我们发现他会直接打印出id的值
下面我们再加一句输出语句
System.out.println(sif1.getShopname());此时我们可以看看eclipse的控制台显示了什么了
是的,他显示出了id和一条sql查询语句
然后在我的项目中,还犯了一个更大的错误,那就是我把这个代理对象作为参数传递给了另一个类用,那么就会直接报错了,不会去查询数据库了
然后我们看看get方法,我直接将上面的load改成get
我们看看控制台显示了什么
Hibernate: select shopinform0_.lshopid as lshopid1_0_0_, shopinform0_.lshopstock as lshopsto2_0_0_, shopinform0_.lshopdate as lshopdat3_0_0_, shopinform0_.lshopdes as lshopdes4_0_0_, shopinform0_.lshopdy as lshopdy5_0_0_, shopinform0_.lshopfenlei as lshopfen6_0_0_, shopinform0_.lshopiden as lshopide7_0_0_, shopinform0_.lshopimg as lshopimg8_0_0_, shopinform0_.lshopname as lshopnam9_0_0_, shopinform0_.lshoporigin as lshopor10_0_0_, shopinform0_.lshopprice as lshoppr11_0_0_, shopinform0_.lsubshopStock as lsubsho12_0_0_ from LB_ShopInformation shopinform0_ where shopinform0_.lshopid=? 18 sdsd2显示了一条查询语句,并且打印出了id18,和另外一条打印语句
正如您所看到的,get方法获取到的是一个完整的实体对象
总结一下吧:出现上面显示的错误是因为我们使用了load方法来加载一个对象,他是一个代理对象,并没有去sql查询,他里面只保存了id,,当我们使用对象获取其他属性时,就会发出sql语句,但是在spring里面,hibernate是由事务来管理的,如果事务结束了,那session就关闭了,那这个对象就毫无意义了——这就是我的错误所在,把这个代理对象传递给了另一个类使用,所以他连查询语句的sql都不会操作的。
而get方法,他是从数据库中一次性查询,查询到的对象是一个真是的实体对象。因为本例可以直接将load改为get即可
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情