【问题标题】: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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-01
          • 1970-01-01
          • 2013-09-14
          • 2014-01-10
          • 2015-05-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多