【问题标题】:lazy initialization in hibernate休眠中的延迟初始化
【发布时间】:2013-03-19 07:21:30
【问题描述】:
我正在尝试学习 Hibernate,我是通过 hibernate lazy initialization 来的。我对 lazy initialization.
有一些澄清
首先,什么叫惰性初始化,它有什么作用?其次,我应该什么时候去?接下来,我在博客中说,使用它可以提高性能,我只需要知道如何。那么,使用它有什么缺点吗?谁能帮我理解这个lazy initialization?
【问题讨论】:
标签:
hibernate
lazy-initialization
【解决方案1】:
延迟获取(或初始化)与eager 获取相反。延迟抓取,休眠中的默认设置,意味着当从数据库中加载一条记录时,不加载一对多关系的子行。例如
@Entity
@Table(name = "COMPANY")
public class Company {
...
@OneToMany(fetch = FetchType.LAZY)
private Set<Employee> employees = new HashSet<Employee>();
请求公司记录不会返回(设置)员工,必须在另一个查询中请求。
优势
- 性能。仅在需要(和请求)时才加载员工。受益于 CPU、内存、带宽...(Java 端和 SQL 服务器端)。
缺点
请注意,必须在同一会话期间执行对雇员的查询(否则著名的 LazyInitializationException 将不受欢迎)。
This page 包含有趣的信息。
【解决方案2】:
延迟设置决定是否在加载Parent Object的同时加载子对象。你需要设置父类各自的hibernate映射文件。Lazy = true(表示不加载child)默认延迟加载child对象为真。这可以确保子对象不会被加载,除非它们通过在父对象上调用 getChild() 方法在应用程序中显式调用。在这种情况下,当在父对象上实际调用 getChild() 时,hibernate 会发出一个新的数据库调用来加载子对象。但在某些情况下,您确实需要在加载父对象时加载子对象。只需设置lazy=false,当从数据库加载父级时,休眠将加载子级。示例lazy=true(默认)如果不经常需要,可以将用户类的地址子级设为惰性。 lazy=false 但是,当您为在线书店处理图书时,您可能需要为 Book 父级加载 Author 对象。
【解决方案3】:
延迟初始化意味着延迟加载。
简而言之-
当你第一次需要一个对象时初始化它,它可以为你提供高性能,因为不需要的对象不会被加载。"
例如-假设您需要有一个连接多个表的记录。如果您一次获取所有内容,则比仅获取主表所需的时间更长。使用延迟加载将仅在需要时获取其余信息。所以在某些场景下实际上是efficient-loading。