【问题标题】: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。在命名查询中,您只需选择所需的列。