SSH lazy机制.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
SSH lazy机制

SSH lazy机制 不用lazy的查询 一:单条数据的多表查询 使用super.getHibernateTemplate().get()查询时,可以得到他相关联的表的数据 如:petInfo 和petDiary表 ApplicationContext ctx = new ClassPathXmlApplicationContext(applicationContext.xml); PetBiz biz = (PetBiz)ctx.getBean(petBiz); PetInfo p= biz.get(9); Iterator t= p.getPetDiaries().iterator(); while (t.hasNext()) { PetDiary o=(PetDiary)t.next(); System.out.println(o.getDiaryAuthor()); 根据PetInfo 得到petDiary的数据 二:多条数据的多表查询 不能用hql=from petInfo 得到多表的数据,要用连接查询 如: hql=from PetDiary d inner join fetch d.petInfo ---------------------------------------------------------------------------------------------------------------- 使用lazy的查询-------------------------延迟检索策略 把petInfo .hbm.xml文件的class元素的lazy属性设为true,表示使用延迟检索策略 这样使用上面的get()得到单条数据就会错: 错误信息为: 如果对一个类或者集合配置了延迟检索策略, 那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。 如果在游离状态时才初始化它,就会产生延迟初始化错误。 当执行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接口的代理类。 以下代码先通过Session的load()方法加载Customer对象,然后访问它的name属性: tx = session.beginTransaction(); Customer customer=(Customer)session.load(Customer.class,new Long(1)); customer.getName(); mit(); 在运行session.load()方法时Hibernate不执行任何select语句, 仅仅返回Customer类的代理类的实例,它的OID为1,这是由load()方法的第二个参数指定的。 当应用程序调用customer.getName()方法时,Hibernate会初始化Customer代理类实例, 从数据库中加载Customer对象的数据,执行以下select语句: select * from CUSTOMERS where ID=1; select * from ORDERS where CUSTOMER_ID=1; 当class元素的lazy属性为true, 会影响Session的load()方法的各种运行时行为,下面举例说明。 1.如果加载的Customer对象在数据库中不存在,Session的load()方法不会抛出异常, 只有当运行 c

文档评论(0)

htfyzc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档