2

我正在尝试学习 Hibernate,我通过了hibernate lazy initialization. 我有一些关于lazy initialization.

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

4

3 回答 3

9

延迟获取(或初始化)与急切获取相反。延迟抓取,休眠中的默认设置,意味着当从数据库中加载一条记录时,不加载一对多关系的子行。例如

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

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

好处

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

缺点

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

请注意,必须在同一会话期间执行对雇员的查询(否则著名的LazyInitializationException将不受欢迎)。

此页面包含有趣的信息。

于 2013-03-19T07:32:29.260 回答
3

延迟初始化意味着延迟加载。

短短几句话——

当你第一次需要一个对象时初始化它,它可以为你提供高性能,因为不需要的对象不会被加载。”

例如 - 假设您需要有一个连接多个表的记录。如果您一次获取所有内容,则将比仅获取主表花费更长的时间。使用延迟加载将仅在需要时获取其余信息。所以它实际上是efficient-loading在某些场景中。

于 2013-03-19T07:27:11.980 回答
3

延迟设置决定是否在加载父对象时加载子对象。您需要设置父类的各个休眠映射文件。Lazy = true(表示不加载子对象)默认情况下子对象的延迟加载为true。这确保子对象不会被加载,除非它们通过调用getChild()父对象的方法在应用程序中显式调用。getChild()在这种情况下,当在父对象上实际调用时,hibernate 会发出一个新的数据库调用来加载子对象。但在某些情况下,您确实需要在加载父对象时加载子对象。当从数据库加载父级时,只需设置lazy=false和休眠将加载子级。示例lazy=true(默认)如果不经常需要,可以将 User 类的地址子级设为惰性。lazy=false但是,当您处理在线书店的图书时,您可能需要为 Book 父级加载 Author 对象。

于 2013-11-18T07:17:39.097 回答