Hibernate 懒加载

本文详细解释了懒加载的概念及其在Hibernate中的应用,包括一对一、一对多和多对一关系中的懒加载配置与行为特点。

懒加载的意思是查询的时候不会立刻访问数据库,而返回的是代理对象,当真正去使用对象的时候才会访问数据库。

 

load(Object, Serializable):根据id查询 。查询返回的是代理对象,不会立刻访问数据库,是懒加载的。当真正去使用对象的时候才会访问数据库。

用load的时候会发现不会打印出查询语句,而使用get的时候会打印出查询语句。

使用load时如果在session关闭之后在查询此对象,会报异常:could not initialize proxy - no Session。处理办法:在session关闭之前初始化一下查询出来的对象:Hibernate.initialize(user);

使用load可以提高效率,因为刚开始的时候并没有查询数据库。但很少使用。

 

一、一对一的懒加载分析

一对一的时候,查询主对象时默认不是懒加载。即:查询主对象的时候也会把从对象查询出来。

需要把主对象配制成lazy="true"  constrained="true"  fetch="select"。此时查询主对象的时候就不会查询从对象,从而实现了懒加载。

一对一的时候,查询从对象的是偶默认是懒加载。即:查询从对象的时候不会把主对象查询出来。

 

二、一对多的懒加载分析

一对多的时候,查询主对象时默认是懒加载。即:查询主对象的时候不会把从对象查询出来。

一对多的时候,查询从对象时默认是懒加载。即:查询从对象的时候不会把主对象查询出来。

需要配置主对象中的set集合 lazy="false" 这样就配置成是不懒加载了。或者配置抓取方式fetch="join"也可以变成不懒加载。

 

三、多对一的懒加载分析

多对一的时候,查询主对象时默认是懒加载。即:查询主对象的时候不会把从对象查询出来。

多对一的时候,查询从对象时默认是懒加载。即:查询从对象的时候不会把主对象查询出来。

 

 

 

### Hibernate 框架中的懒加载 #### 懒加载的概念及其工作原理 在Hibernate框架中,懒加载是一种优化技术,用于延迟加载关联对象直到实际访问这些对象时才进行加载。这种方式可以显著减少不必要的数据库查询次数和数据传输量,从而提高应用程序性能[^2]。 #### 实现懒加载的方法 为了实现懒加载,在映射文件(如`hbm.xml`配置文件或注解方式)定义实体类之间的关系时指定`fetch="lazy"`属性即可启用该功能。对于使用Java注解的方式来说,则是在相应的字段上加上`@LazyToOne(LazyToOneOption.NO_PROXY)` 或者 `@OneToMany(fetch = FetchType.LAZY)`等类似的声明来开启懒加载特性[^1]。 ```java @Entity public class Parent { @Id private Long id; @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY) private Set<Child> children; // getters and setters... } ``` 当通过Parent实例获取children集合的时候,默认情况下不会立即执行SQL语句去读取子表的数据;只有真正遍历这个集合或者调用了size()之类会触发初始化的操作才会发起新的查询请求并填充child记录到内存当中。 #### 常见问题及解决方案 然而,在应用懒加载的过程中可能会遇到一些挑战,其中最典型的就是`org.hibernate.LazyInitializationException: could not initialize proxy - no Session`异常。此错误通常发生在尝试访问未被加载的对象图部分而此时Session已经关闭的情况下[^3]。 针对上述提到的问题有几种常见的处理办法: - **确保Session处于打开状态**:可以在业务逻辑层保持住当前事务范围内的持久化上下文不被过早释放; - **采用EAGER策略代替LAZY**:虽然这违背了懒加载的设计初衷,但在某些特定场景下可能是必要的折衷方案之一; - **利用Open Session In View模式**:这是一种Web开发实践,它允许HTTP请求期间始终维持一个活跃的SessionFactory连接直至视图渲染完成后再断开链接; - **提前触发加载操作**:比如可以通过编写自定义方法显式地触发展示所需的部分数据结构之前就将其完全加载入内存之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值