日期:2014-05-16  浏览次数:20447 次

Hibernate.initialize重新从数据库中加载对像
在使用hibernate进行持久化时,有时需要动态的改变对象的加载,比如在编辑页面里面lazy=true,而在浏览页面lazy=false,这样可以在需要lazy的地方才进行控制。而配置文件中Lazy属性是全局控制的,如何处理呢?

当<class> 元素或者<set>元素的lazy属性为true时,load() or get() or find()加载这些对象时,Hibernate不会马上产生任何select语句,只是产生一个Obj代理类实例,只有在session没有关闭的情况 下运行Obj.getXxx()时才会执行select语句从数据库加载对象,如果没有运行任何Obj.getXxx()方法,而session已经关 闭,Obj已成游离状态,此时再运行Obj.getXxx()方法,Hibernate就会抛出"Could not initialize proxy - the owning Session was closeed"的异常,是说Obj代理类实例无法被初始化。然而想在Session关闭之前不调用Obj.getXxx()方法而关闭Session之 后又要用,此时只要在Session关闭之前调用Hibernate.initialize(Obj)或者 Hibernate.initialize(Obj.getXxx())即可,net.sf.hibernate.Hibernate类的 initialize()静态方法用于在Session范围内显示初始化代理类实例。


         在配置文件里面可以用lazy=true,在程序里面可以用强制加载的方法Hibernate.initialize(Object proxy) 方法强制加载这样就相当于动态改变为lazy=false。
         但在使用时需要注意的一点是:其中的proxy是持久对象的关联对象属性,比如A实体,你要把A的关联实体B也检出,则要写Hibernate.initialize(a.b)。
1 楼 pengjunwu 2009-12-30  
lazy属性对get()无效吧。。。。。
2 楼 shameant 2010-01-08  
对的,get()方法直接返回了实例,此实例非代理实例。