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