我正在尝试学习Hibernate,我来了 hibernate lazy initialization
。我对 lazy initialization.
首先,什么是所谓的Lazy初始化,它做什么?其次,我该什么时候去?接下来,我发现,在博客中说,使用它可以提高性能,我只需要知道如何。那么,有没有使用它的缺点?任何人都可以帮助我理解 lazy initialization
吗?
答案 0 :(得分:7)
延迟提取(或初始化)与渴望提取相反。延迟提取是hibernate中的默认设置,意味着当从数据库加载记录时,不会加载一对多关系子行。 E.g。
@Entity
@Table(name = "COMPANY")
public class Company {
...
@OneToMany(fetch = FetchType.LAZY)
private Set<Employee> employees = new HashSet<Employee>();
请求公司记录不会返回(设置)员工,他们必须在另一个查询中被请求。
优点
缺点
请注意,Employees上的查询必须在同一个会话期间执行(或者着名的 LazyInitializationException 将不受欢迎)。
This page包含有趣的信息。
答案 1 :(得分:3)
延迟初始化意味着延迟加载。
用极少的话说 -
首次需要时初始化一个对象,它可以提供高性能,因为不会加载不必要的对象。“
例如 - 假设您需要有一个连接多个表的记录。如果你一次性获取它,它将花费更长的时间,而不是只提取主表。使用延迟加载时,只有在需要时才会获取其余信息。所以在某些情况下它实际上是efficient-loading
。
答案 2 :(得分:3)
延迟设置决定是否在加载父对象时加载子对象。你需要这样设置父类的相应hibernate映射文件。Lazy = true
(表示不加载子对象)默认情况下延迟加载子对象是真的。这样可以确保不加载子对象,除非通过在父对象上调用getChild()
方法在应用程序中显式调用它们。在这种情况下,当父对象实际调用getChild()
时,hibernate会发出一个新的数据库调用来加载子进程。但在某些情况下,您需要在加载父项时加载子对象。只需创建lazy=false
,hibernate将在从数据库加载父项时加载子项。示例lazy=true
(默认)如果不经常需要,则可以使User类的地址子项变为惰性。 lazy=false
但是,每当您处理在线书店的图书时,您可能需要为Book父级加载Author对象。