Hibernate中的懒加载

现在我将讨论一下一个在Hibernate中必须知道的特点,特别是在一个很大的应用中时,会有这样的涉及,叫做懒加载。

什么时候需要懒加载:简单的问题

考虑一个简单的网络应用程序:网上书店,书店维护者产品的目录。最原始的方法,它可以投射到一个模型实体中去用来管理一系列的产品实体。在一个大的书店中,会有成千上万的产品划分成不同的目录。当一个用户访问这个书店的时候,目录必须要从数据库中加载,我们很可能不想要加载每一个实体到内存中去。对于一个大型的零售商,考虑到物理内存把这个大量的数据加载到机器中或许不可能,即使这是可能的,它也会削弱站点的性能,我们或许只想加载目录,顶多再加上类别。只有当用户深入到目录的时候,他底下的子菜单应该在数据库中加载。为了管理这个问题,Hibernate提供了一种简便的方式叫做懒加载,当启用的时候,只有当直接请求的时候才会加载实体。

懒加载是如何解决问题的

现在我们已经理解了这个问题,我们来了解一下懒加载在实际中是如何帮助我们的,如果我们考虑解决上边的问题,我们可能会采用下边的方式访问目录
//Following code loads only a single category from the database:
Category category = (Category)session.get(Category.class,new Integer(42));

但是如果所有的目录都是可以访问的,并且懒加载也有效,产品的介绍根据需求从数据库中获取。例如,在下边的代码中,只有在第二行中引用的时候才会加载产品对象
/Following code loads only a single category from the database
Category category = (Category)session.get(Category.class,new Integer(42));
//This code will fetch all products for category 42 from database 'NOW'
Set<Product> products = category.getProducts();

这解决了按需加载的问题

怎么使懒加载在Hibernate中有效

在讲下一步之前,强调一下默认使用懒加载的两种情况的不同反应是很重要的。
默认行为是“快速的加载属性”,“缓慢的加载集合”。在Hibernate2中你或许还记得所有的引用是默认急加载的。同样需要注意的是@OneToMany和@ManyToMany是默认懒加载的,@OneToOne和@ManyToOne默认是急加载的,记住它将来可以避免很多陷阱。
为了使用懒加载你必须在想要懒加载的关系上显示的使用"fetch = FetchType.LAZY",一个使用的例子如下:
@OneToMany( mappedBy = "category", fetch = FetchType.LAZY )
private Set<ProductEntity> products; 

和它平行的一个属性是"FetchType.EAGER",它是和LAZY相反的。

原文地址:http://howtodoinjava.com/2014/09/26/lazy-loading-in-hibernate/
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值