我正在尝试学习 Hibernate,我通过了hibernate lazy initialization
. 我有一些关于lazy initialization.
首先,什么叫惰性初始化,它是做什么的?其次,我应该什么时候去?接下来,我在博客中说,使用它可以提高性能,我只需要知道如何。那么,使用它有什么缺点吗?任何人都可以帮助我理解这一点lazy initialization
吗?
我正在尝试学习 Hibernate,我通过了hibernate lazy initialization
. 我有一些关于lazy initialization.
首先,什么叫惰性初始化,它是做什么的?其次,我应该什么时候去?接下来,我在博客中说,使用它可以提高性能,我只需要知道如何。那么,使用它有什么缺点吗?任何人都可以帮助我理解这一点lazy initialization
吗?
延迟获取(或初始化)与急切获取相反。延迟抓取,休眠中的默认设置,意味着当从数据库中加载一条记录时,不加载一对多关系的子行。例如
@Entity
@Table(name = "COMPANY")
public class Company {
...
@OneToMany(fetch = FetchType.LAZY)
private Set<Employee> employees = new HashSet<Employee>();
请求公司记录不会返回(设置)员工,必须在另一个查询中请求。
好处
缺点
请注意,必须在同一会话期间执行对雇员的查询(否则著名的LazyInitializationException将不受欢迎)。
此页面包含有趣的信息。
延迟初始化意味着延迟加载。
短短几句话——
当你第一次需要一个对象时初始化它,它可以为你提供高性能,因为不需要的对象不会被加载。”
例如 - 假设您需要有一个连接多个表的记录。如果您一次获取所有内容,则将比仅获取主表花费更长的时间。使用延迟加载将仅在需要时获取其余信息。所以它实际上是efficient-loading
在某些场景中。
延迟设置决定是否在加载父对象时加载子对象。您需要设置父类的各个休眠映射文件。Lazy = true
(表示不加载子对象)默认情况下子对象的延迟加载为true。这确保子对象不会被加载,除非它们通过调用getChild()
父对象的方法在应用程序中显式调用。getChild()
在这种情况下,当在父对象上实际调用时,hibernate 会发出一个新的数据库调用来加载子对象。但在某些情况下,您确实需要在加载父对象时加载子对象。当从数据库加载父级时,只需设置lazy=false
和休眠将加载子级。示例lazy=true
(默认)如果不经常需要,可以将 User 类的地址子级设为惰性。lazy=false
但是,当您处理在线书店的图书时,您可能需要为 Book 父级加载 Author 对象。