Hibernate 的 load 方法用法

hibernate 提供的 load 方法,用于读取数据,并能充分利用一、二级缓存,一般,对 load 方法的说明如下:

      Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。load()方法可返回实体的代理类实例,而get方法永远直接返回实体类。
      写如下的代码:

 public Object LoadObject(Class<?> cClass, Object mKey, boolean bCloseSession)
     throws ObjectNotFoundException
 {
     this.getSession();
     Object obj;
 try
 {
     obj = (Object) session.load(cClass, (Serializable) mKey);
 }
 catch (ObjectNotFoundException e)
 {
     throw e;
 }
     if (bCloseSession)
         this.closeSession();
     return obj;
 }

     我们的目的很明确,就是如果没有查到数据,就抛出异常。

    但实际的执行情况呢?并非我们所想的,在这里,他不会抛出异常。而是一直执行,直接从 obj 中读取数据时,才会抛出ObjectNotFoundException 的异常。因此,异常的捕获,就要在读取数据时才行,而不是在获取对象时。
 Test t = (Test) db.LoadObject(Test.class, new String("ff80808121302e360121302e37e30188"));
 try
 {
     System.out.println(t.getCode());
 }
 catch (ObjectNotFoundException e)
 {
     e.printStackTrace();
 }

   对于 load 方法,还有一个问题,那就是,如果在查询完后马上关闭 session, 有两种结果:

   第一、如果在 hbm 文件中,设定 lazy=true, 就会异常:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
 at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:86)
 at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140)
 at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
 at netway.hibernate.Test_$$_javassist_0.getCode(Test_$$_javassist_0.java)
 at BatchTest.testdb(BatchTest.java:107)
 at BatchTest.main(BatchTest.java:80)

 并从输出来看,还没有真正从数据库执行 select (也就是没有打印出查询sql)。

第二、如果设定 lazy=false, 则关闭 session ,不会有上面的问题存在。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值