Как EntityManager merge () определяет новые и старые объекты - PullRequest
0 голосов
/ 10 декабря 2018

У меня сложилась следующая ситуация:

  1. Два энтита, Employee и Project.
  2. ManyToMany двунаправленная связь между ними.
  3. 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.
Извините за длинный вопрос.

...