我遇到以下情况:
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。
对不起,很长的问题。