作者:苗淑香哈哈_405_408 | 来源:互联网 | 2024-11-20 10:03
本文详细介绍了Hibernate中的立即检索与延迟检索的概念及区别,同时探讨了类级别与关联级别的检索配置方法。通过具体的配置示例,帮助开发者更好地理解和应用这些策略。
1. 立即检索与延迟检索的区别
1.1 立即检索
在执行特定代码时,系统会立即触发SQL查询操作。最典型的例子是使用get()
方法,该方法会直接从数据库中加载实体数据。
1.2 延迟检索
与立即检索不同,延迟检索在执行代码时并不会立刻发送SQL查询。相反,它会在实际需要数据时才进行查询,从而提高性能。常用的实现方式是通过load()
方法。
2. 类级别与关联级别的检索配置
2.1 类级别的检索配置
类级别的检索配置通常在映射文件的class
标签中设置lazy
属性,用于控制整个类的加载行为。
2.2 关联级别的检索配置
关联级别的检索配置则是在关联映射(如set
或many-to-one
)中设置lazy
属性,以控制关联对象的加载策略。
3. 具体配置示例
3.1 从一方关联多方
* <set>
* fetch: 控制SQL语句的类型
* join: 发送迫切左外连接的SQL查询关联对象。如果fetch="join"
,则lazy
属性将被忽略。
* select: 默认值,发送多条SQL查询关联对象。
* subselect: 发送子查询查询关联对象。(需使用Query接口测试)
* lazy: 控制关联对象的检索是否采用延迟
* true: 默认值,查询关联对象时使用延迟检索
* false: 查询关联对象时不使用延迟检索
* extra: 极其懒惰。如果fetch
是join
的情况,则lazy
属性将被忽略。
3.2 从多方关联一方
* <many-to-one>
* fetch: 控制SQL语句的发送格式
* join: 发送一个迫切左外连接查询关联对象。如果fetch="join"
,则lazy
属性将被忽略。
* select: 发送多条SQL检索关联对象
* lazy: 控制关联对象检索时是否采用延迟
* false: 不延迟
* proxy: 使用代理。检索订单时,是否立即检索客户由Customer
对象的映射文件中class
标签上的lazy
属性决定。
* no-proxy: 不使用代理