could not initialize proxy - no Session

 昨天被个超经典的问题困扰到了:web

hibernate延迟加载的传说级错误org.hibernate.LazyInitializationException: could not initialize proxy - no Session数据库

并且很奇怪的是这个问题在运行阶段100%出错,而在debug的时候却会有成功的可能,百思不得其解,在网上也找出不少答案,终于找到一个靠谱的供你们参考:session

延迟初始化错误是运用Hibernate开发项目时最多见的错误。若是对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。若是在游离状态时才初始化它,就会产生延迟初始化错误。ide

下面把Customer.hbm.xml文件的<class>元素的lazy属性设为true,表示使用延迟检索策略: 
<class name="mypack.Customer" table="CUSTOMERS" lazy="true"工具

当执行Session的load()方法时,Hibernate不会当即执行查询CUSTOMERS表的select语句,仅仅返回Customer类的代理类的实例,这个代理类具由如下特征: 

(1)由Hibernate在运行时动态生成,它扩展了Customer类,所以它继承了Customer类的全部属性和方法,但它的实现对于应用程序是透明的。 
(2)当Hibernate建立Customer代理类实例时,仅仅初始化了它的OID属性,其余属性都为null,所以这个代理类实例占用的内存不多。 
(3)当应用程序第一次访问Customer代理类实例时(例如调用customer.getXXX()或customer.setXXX()方法), Hibernate会初始化代理类实例,在初始化过程当中执行select语句,真正从数据库中加载Customer对象的全部数据。但有个例外,那就是当应用程序访问Customer代理类实例的getId()方法时,Hibernate不会初始化代理类实例,由于在建立代理类实例时OID就存在了,没必要到数据库中去查询。 

提示:Hibernate采用CGLIB工具来生成持久化类的代理类。CGLIB是一个功能强大的Java字节码生成工具,它可以在程序运行时动态生成扩展 Java类或者实现Java接口的代理类。关于CGLIB的更多知识,请参考:http://cglib.sourceforge.net/ spa

而后我将session的load方法改为get就能够了~.net

相关文章
相关标签/搜索