Hibernate操作延迟加载的关联

Hibernate操作延迟加载的关联有很多值得学习的地方,这里我们主要介绍Hibernate延迟,包括介绍Hibernate延迟使用等方面。

创新互联公司主营黟县网站建设的网络公司,主营网站建设方案,重庆APP开发,黟县h5成都小程序开发搭建,黟县网站营销推广欢迎黟县等地区企业咨询

默认情况下,Hibernate 3对集合使用延迟select抓取,对返回单值的关联使用延迟代理抓取。对几乎是所有的应用而言,其绝大多数的关联,这种策略都是有效的。

注意:假若你设置了hibernate.default_batch_fetch_size,Hibernate会对延迟加载采取批量抓取优化措施(这种优化也可能会在更细化的级别打开)。

然而,你必须了解延迟抓取带来的一个问题。在一个打开的Hibernate session上下文之外调用延迟集合会导致一次意外。比如:

 
 
 
  1. s = sessions.openSession();
  2. Transaction tx = s.beginTransaction();
  3.             
  4. User u = (User) s.createQuery("from User u where u.name=:userName")
  5.     .setString("userName", userName).uniqueResult();
  6. Map permissions = u.getPermissions();
  7. tx.commit();
  8. s.close();
  9. Integer accessLevel = (Integer) permissions.get("accounts");  // Error!

在Session关闭后,permessions集合将是未实例化的、不再可用,因此无法正常载入其状态。 Hibernate对脱管对象不支持延迟实例化. 这里的修改方法是:将permissions读取数据的代码 移到tx.commit()之前。

除此之外,通过对关联映射指定lazy="false",我们也可以使用非延迟的集合或关联。

但是, 对绝大部分集合来说,更推荐使用延迟方式抓取数据。如果在你的对象模型中定义了太多的非延迟关联,Hibernate最终几乎需要在每个事务中载入整个数据库到内存中!

但是,另一方面,在一些特殊的事务中,我们也经常需要使用到连接抓取(它本身上就是非延迟的),以代替查询抓取。

这里我们就不再说明如何具体的定制Hibernate中的抓取策略。在Hibernate3中,具体选择哪种抓取策略的机制是和选择单值关联或集合关联相一致的。

当前标题:Hibernate操作延迟加载的关联
文章URL:http://www.shufengxianlan.com/qtweb/news19/66219.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联