【问题标题】:Does Hibernate result in unwanted data being fetched?Hibernate 会导致获取不需要的数据吗?
【发布时间】:2012-03-15 12:19:32
【问题描述】:

例如,假设有一个名为“班级”的表,并且很多“学生”属于一个班级。如果我们想获取所有学生的名字,使用 Hibernate,因为我们获取 Student 对象,年龄和其他数据(不是延迟加载的)也将被获取。

但是使用 sql 查询,我们只能获取名字。

那么这是否意味着使用 Hibernate 会导致获取不需要的数据?如果是这样,它不会对系统的性能产生很大的影响吗?

【问题讨论】:

    标签: performance hibernate lazy-loading


    【解决方案1】:

    如果您想在休眠状态下获取班级学生的名字,可以尝试以下HQL

    select s.firstName from Student s where s.divisionId = 4

    这将为您提供仅限学生名字的列表。因此,姓氏、年龄等将不会被加载。 因此,对于您问题中的场景,您可以使用休眠获得良好的性能。

    现在,当您需要第 4 区的 List<Students> 时,请使用以下查询,

    select s from Student s where s.divisionId = 4

    想象一下在SQL 中编写此查询并将每一列转换为其相应的java 属性等。所有这些hibernate 在上面为您完成了它。 因此,您可以根据需要调整休眠模式。

    Hibernate 的性能比传统的 JDBC 慢一点,但比 JDBC 方便有效得多。基本上,您从休眠中获得的好处超过了较小的缺点。

    您应该了解诸如 Lazy loading 之类的 hibernate 中的性能陷阱,并且应该尽量避免这些。

    【讨论】:

      【解决方案2】:

      是的,Hibernate 会获取所有非延迟加载的字段。它对性能的影响取决于应用程序的用例。如果您经常需要包含许多列(例如 > 10)的表中的部分(即只有一或两列)数据,那么它肯定会增加内存使用量、所需的 CPU 周期和传输数据的带宽消耗(如果数据库服务器与应用程序服务器位于不同的机器上)。要克服这个问题,您可以使用NamedQuery。在命名查询中,您只需选择所需的列。

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 2020-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        • 2011-12-30
        • 1970-01-01
        相关资源
        最近更新 更多