Я разрабатываю приложение в Hibernate, где у меня есть классы моделей, подобные этим:
public class Employee
{
private int ID;
private String name;
private Department department;
//other properties
//constructors, getters and setters
}
Обратите внимание, что 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
}
Существует ManyToOne
двунаправленная связь между Employee
и Department
.
Чтобы добавить новый Employee
к существующему Department
, я делаю следующее
Department existingDepartment = ...;
Employee newEmployee = ...;
existingDepartment.addEmployee(newEmployee);
employee.setDepartent(existinDepartment);
session.save(newEmployee);
Теперь концептуально два 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;
}
Теперь проблема в том, что когда я создаю new Employee();
, у меня нет его ID
, так как он будет назначен, когда он будет сохранен. Поэтому, когда я говорю
existingDepartment.addEmployee(newEmployee);
внутренний HashSet
объекта Department
эффективно использует метод equals()
, который не работает [поскольку он использует переменную-член для определения равенства, которое не было должным образом инициализировано].
Это кажется очень простой проблемой, но как мне ее решить? Или я проектирую свои уроки совершенно неправильно? Или мой метод equals
должен быть переписан для сравнения других значений вместо ID
, что, я думаю, было бы абсурдом.