У меня сложилась следующая ситуация:
- Два энтита,
Employee
и Project
. ManyToMany
двунаправленная связь между ними. Project
является владельцем.
Employee
выглядит следующим образом:
@Entity
public class Employee implements Serializable {
@Id
@Basic(optional = false)
private Integer id;
private String name;
@ManyToMany(mappedBy = "employees")
private Set<Project> projects = new HashSet<>();
@Override
public int hashCode() {
int hash = 7;
hash = 23 * hash + Objects.hashCode(this.id);
hash = 23 * hash + Objects.hashCode(this.name);
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
final Employee other = (Employee) obj;
return (Objects.equals(this.name, other.name) && Objects.equals(this.id, other.id));
}
А если Project[Id=1]
имеет отношения к:
Employee[Id=1, name="John"]
Employee[Id=2, name="Hal"]
Employee[Id=3, name="Bob"]
(Теперь это часть, которая смущает меня.) Если мы теперь используем:
Set<Employee> employees = new HashSet<>();
employees.add(new Employee(1, "John Again"));
employees.add(new Employee(4, "Gary"));
employees.add(new Employee(5, "Ron"));
Project projekat = new Project(1);
project.setEmployees(employees);
em.merge(project);
Тогда Project[Id=1]
будет иметь отношение к:
Employee[Id=1, name="John"] ***Why just "John"?***
Employee[Id=4, name="Gary"]
Employee[Id=5, name="Ron"]
Итак, мойвопрос:
- Как
EnitityManager#merge()
знает, какой объект должен быть вставлен, а какой удален из Project_Employee
таблицы присоединения, потому что в этом случае Employee[Id=1, name="John"]
и Employee[Id=1, name="John Again"]
не совпадаютобъекты (примечание equals()
и hashCode()
)?
Я ожидал, что Employee[Id=1, name="John"]
будет удален и Employee[Id=1, name="John Again"]
вставлен как совершенно новый объект.Но Employee[Id=1, name="John"]
не удаляется, как, например, Employee[Id=2, name="Hal"]
, которого нет во втором списке.
Я использую JEE8, EclipseLink и Derby DB.
Извините за длинный вопрос.