【问题标题】:Updating the count of 'many' items in a Table using Hibernate使用 Hibernate 更新表中“许多”项目的计数
【发布时间】:2013-02-14 05:50:43
【问题描述】:

我的数据库中有一个简单的一对多关系。以下是对应的类:

class Department
{
    int deptId;
    int count; //This corresponds to the total number of Employees in a department
    List<Employee> employees; //An employee belongs to only one department
}

class Employee
{
    int employeeId;
    Department dept;
}

为了保持count 更新,我在每个CUD 操作上设置count。是否有一种自动方法来更新部门每次添加/删除员工时的count? (注释/限制什么的?)

【问题讨论】:

    标签: java hibernate orm count one-to-many


    【解决方案1】:

    据我所知,Hibernate 中没有自动方式。

    无论如何,这通常有产生错误结果的风险。如果一个用户添加了一名员工,同时第二个用户删除了另一名员工,会发生什么? (这种情况仍然可以在 Hibernate 中处理。)或者如果 dba 通过插入语句添加一些员工或从备份中加载数据会发生什么?

    在数据库模型看来,这是多余的信息,应该省略。相反,应该使用SELECT COUNT(*) FROM employee WHERE dept =:deptId

    计数列的唯一原因是如果您经常需要计数并且您在使用 select(*) 时遇到性能问题。对于这种特殊情况,没有 Hibernate 自动化。

    编辑:

    我刚刚看到 Overmeulens 的回答。这也行得通。如果您只需要计数,那么SELECT COUNT(*)(也可以在 HQL 中完成)更快,如果您仍然需要员工记录,那么 Overmeulens 解决方案具有更好的性能。

    【讨论】:

    • 我知道保持计数字段的神圣性会很困难。但是,我想避免每次获取时选择计数(*)。 [写入将始终使用 Hibernate,不允许 DBA 执行外部操作。]
    • 我只是想解释一下为什么可能没有自动化。您可以继续您的解决方案,手动计数(或在每次添加或删除员工后执行SELECT COUNT(*) - 无论如何不会经常发生),然后选择要更新的部门或在部门表中引入版本列(您无论如何都应该拥有它),每当添加或删除员工时都会增加。
    【解决方案2】:

    您为什么要在员工人数中保留一个全局变量? 添加一个返回员工列表大小的方法更安全、更优雅。

    public class Department {
    
       private int deptId;
       private List<Employee> employees;
    
       public int getCount() {
          if (employees == null) {
             return 0;
          }
          return employees.size();
       }
    }
    

    【讨论】:

    • 不错的答案。为什么你只在stackoverflow上冷静? :P
    • 只是我不想加载每个部门访问的所有员工行。 FetchType 是懒惰的。但是,我需要在每个部门阅读时显示摘要(员工人数)。
    • 那你应该看看“Extra Lazy”的抓取技巧:docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/…。如果你使用注解,你只需要添加@LazyCollection(LazyCollectionOption.EXTRA)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多