Hibernate中equals()方法的问题

use*_*138 6 java hibernate

我正在Hibernate中开发一个应用程序,我有这样的模型类:

public class Employee
{
    private int ID;
    private String name;
    private Department department;
    //other properties
    //constructors, getters and setters
}
Run Code Online (Sandbox Code Playgroud)

请注意,该ID值不是用户填充的值,而是使用GenerationType.Identity作为填充的值填充strategy.

我还有另一个课程Department如下:

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

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

    //other implementations
}
Run Code Online (Sandbox Code Playgroud)

a 和a ManyToOne之间存在双向关系.EmployeeDepartment

因此,要向Employee现有内容添加新内容Department,请执行以下操作

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

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

session.save(newEmployee);
Run Code Online (Sandbox Code Playgroud)

现在从概念上讲Employee,如果它们具有相同的两个对象是相同的ID.所以我equals()Employee班上的方法看起来像这样:

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

    Employee other = (Employee)o;

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

    return false;
}
Run Code Online (Sandbox Code Playgroud)

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

existingDepartment.addEmployee(newEmployee);
Run Code Online (Sandbox Code Playgroud)

内部HashSet的的Department对象被有效地使用equals(),其被分解方法[因为它使用一个成员变量,以确定平等,由于没有被正确初始化.

这似乎是一个非常基本的问题但是,我该如何解决呢?或者我设计的课程完全错了?或者我的equals方法应该重写以比较其他值而不是ID,我想这将是荒谬的.

Sea*_*oyd 6

这似乎是一个非常基本的问题但是,我该如何解决呢?或者我设计的课程完全错了?或者我应该重写我的equals方法来比较其他值而不是ID,我想这将是荒谬的.

关于这一点有两种不同的哲学.

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

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

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

缺点:具有相同id的两个对象可能会变得不相等.

我更喜欢第二种方法,从Java的角度来看它更有意义(虽然不可能从数据库的角度来看).我唯一想确定的是你永远不会混淆这些方法.

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