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 ,不会有上面的问题存在。