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相反的。

发布了81 篇原创文章 · 获赞 11万+ · 访问量 1382万+

猜你喜欢

转载自blog.csdn.net/yjclsx/article/details/84286571
今日推荐