Hibernate中的懒加载

懒加载是一种优化数据库操作的技术,特别是在大型应用程序如网上书店中。它允许只在真正需要时才从数据库加载数据,从而提高性能并减少内存占用。在Hibernate中,懒加载默认对集合进行配置,例如@OneToMany和@ManyToMany关系是懒加载的,而@OneToOne和@ManyToOne则是急加载。通过在关系映射上设置'fetch=FetchType.LAZY',可以明确启用懒加载,确保实体直到被请求时才加载,如产品实体在用户深入目录时才加载。这种方式解决了按需加载的问题,避免了不必要的资源消耗。

懒加载的应用场景
考虑一个简单的网络应用程序:网上书店,书店维护者产品的目录。最原始的方法,它可以投射到一个模型实体中去用来管理一系列的产品实体。在一个大的书店中,会有成千上万的产品划分成不同的目录。当一个用户访问这个书店的时候,目录必须要从数据库中加载,我们很可能不想要加载每一个实体到内存中去。对于一个大型的零售商,考虑到物理内存把这个大量的数据加载到机器中或许不可能,即使这是可能的,它也会削弱站点的性能,我们或许只想加载目录,顶多再加上类别。只有当用户深入到目录的时候,他底下的子菜单应该在数据库中加载。为了管理这个问题,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;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值