java - Hibernate 中 equals() 方法的问题

标签 java hibernate

我正在 Hibernate 中开发一个应用程序,其中有如下模型类:

public class Employee
{
    private int ID;
    private String name;
    private Department department;
    //other properties
    //constructors, getters and setters
}

请注意,ID 不是由用户填充的值,而是使用 GenerationType.Identity 作为策略 填充的。

我还有另一个类 Department 如下:

public class Department
{
    private int ID;
    private String name;

    private Set<Employee> employees; //this is actually a HashSet

    //other implementations
}

EmployeeDepartment 之间存在ManyToOne 双向关系。

因此,要将新的 Employee 添加到现有的 Department,我将执行以下操作

Department existingDepartment = ...;
Employee newEmployee = ...;

existingDepartment.addEmployee(newEmployee);
employee.setDepartent(existinDepartment);

session.save(newEmployee);

现在从概念上讲,如果两个 Employee 对象具有相同的 ID,则它们是相同的。所以我在 Employee 类中的 equals() 方法如下所示:

public boolean equals(Object o)
{
    if(!(o instanceOf Employee))
    {
        return false;
    }

    Employee other = (Employee)o;

    if(this.ID == o.etID())
    {
        return true;
    }

    return false;
}

现在的问题是,当我创建一个 new Employee(); 时,我没有它的 ID,因为它将在持久化时分配。所以当我说

existingDepartment.addEmployee(newEmployee);

Department 对象的内部 HashSet 有效地使用了一个被破坏的 equals() 方法 [因为它使用一个成员变量来确定未正确初始化的相等性]。

这似乎是一个非常基本的问题,但是我该如何解决呢?还是我设计的类(class)完全错误?或者是否应该重写我的 equals 方法来比较其他值而不是 ID,我认为这很荒谬。

最佳答案

This seems like a very basic problem but, how do I solve it? Or am I designing my classes totally wrong? Or should my equals method be re-written to compare other values instead of ID, which I guess would be absurd.

关于这个有两种不同的哲学。

a) 基于 DB id 的 equals()/hashCode()

缺点:无法比较持久对象和非持久对象

b) 基于内容的equals()/hashCode()

缺点:具有相同 id 的两个对象可能不相等。

我更喜欢第二种方法,从 Java 的角度来看它更有意义(尽管不可否认从数据库的角度来看不是)。 我唯一想确保的是您永远不会混合使用这些方法。

这已经讨论过很多次了,顺便说一句:

关于java - Hibernate 中 equals() 方法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7231807/

相关文章:

java - 乘以 ID 映射抛出 BaseEntity

java - 数组中的数组; Java(帮助完成实验作业)

java - Spring TransactionalTemplate 不会在异常时回滚

c# - NHibernate (Hibernate) 属性自动递增

java - 使用 Java Reflection 调用方法时如何估计方法的执行时间

java - Hibernate Envers 将数据恢复为一个版本

Hibernate 错误 : current transaction is aborted, 命令被忽略,直到事务 block 结束

java - 如何存储文件数据行并通过它的方法计算成字母并在另一个文件中打印字母等级?

java - 是否可以从索引数据结构中删除并同时避免移位?

java - 将方法(或 void)传递给 Java ArrayList