EntityManager merge()如何确定新对象和旧对象

时间:2018-12-10 16:40:58

标签: jpa-2.1 java-ee-8

我遇到以下情况:

  1. EmployeeProject这两个实体。
  2. 它们之间的
  3. ManyToMany投标关系。
  4. 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。
对不起,很长的问题。

0 个答案:

没有答案