gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:11:02 24 4
gpt4 key购买 nike

我正在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com