在hibernate中进行延迟初始化

时间:2013-03-19 07:21:31

标签: hibernate lazy-initialization

我正在尝试学习Hibernate,我来了 hibernate lazy initialization 。我对 lazy initialization.

进行了一些澄清

首先,什么是所谓的Lazy初始化,它做什么?其次,我该什么时候去?接下来,我发现,在博客中说,使用它可以提高性能,我只需要知道如何。那么,有没有使用它的缺点?任何人都可以帮助我理解 lazy initialization 吗?

3 个答案:

答案 0 :(得分:7)

延迟提取(或初始化)与渴望提取相反。延迟提取是hibernate中的默认设置,意味着当从数据库加载记录时,不会加载一对多关系子行。 E.g。

@Entity
@Table(name = "COMPANY")
public class Company {
...
@OneToMany(fetch = FetchType.LAZY)
private Set<Employee> employees = new HashSet<Employee>();

请求公司记录不会返回(设置)员工,他们必须在另一个查询中被请求。

优点

  • 性能。员工仅在需要(和请求)时加载。受益于CPU,内存,带宽......(Java端和SQL服务器端)。

缺点

  • 当还需要员工时,必须执行单独的查询。

请注意,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对象。

相关问题