在使用hibernate进行持久化时,有时须要动态的改变对象的加载,好比在编辑页面里面lazy=true,而在浏览页面lazy=false,这样能够在须要lazy的地方才进行控制。而配置文件中Lazy属性是全局控制的,如何处理呢?
当元素或者元 素的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)。数据库