Hibernate 多对多映射,在多个 parents 中更新相同的 child

Hibernate Many to Many mapping, update same child in multiple parents

我创建了两个实体,Project 和 Employee。一个Project可以有多个员工,多个Project可以有多个员工,所以我选择了ManytoMany关系,如果不对请指正。因为我必须检索我工作的员工的所有项目以及属于一个项目的所有员工。 示例实体 类 如下。

@Entity
@Table(name = "projects")
public class Project {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "project_employee", joinColumns = @JoinColumn(name = "project_id"), inverseJoinColumns = @JoinColumn(name = "employee_id"))
    private Set<Employee> employee;

}

@Entity
@Table(name = "employees")
@Getter
@Setter
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(mappedBy = "employee")
    @JsonBackReference
    private Set<Project> project = new HashSet<Project>();

    private String status;
}

假设有 2 个项目,id 为 1 和 2 4 名员工,id 为 1,2,3,4。

员工 1、2、3 是第一个项目的一部分 员工 2、3、4 是第二个项目的一部分。

员工 2 完成了第一个项目,因此员工实体状态应该为第一个项目完成 员工 2 在第二个项目中被阻止,因此员工实体状态应该为第二个项目被阻止

所以我面临的问题是,如果我更新第一个项目的员工 2 状态,第二个项目也会出现同样的情况,反之亦然。

那么如何解决这个问题,我是否需要通过添加员工和项目映射来为状态创建单独的实体。

在第一个和第二个项目中工作的员工 2 始终是同一个条目。 当您更新员工状态时,这两个项目都会更新,因为这两个项目使用相同的条目。

如果要持久化,那个员工2完成了项目1的工作,但是还在做项目2,你需要一个单独的table,它保存状态,员工id和项目的信息编号

@Entity
@Table(name = "projects")
public class Project {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "project_employee", joinColumns = @JoinColumn(name = "project_id"), inverseJoinColumns = @JoinColumn(name = "employee_id"))
    private Set<Employee> employee;

}

@Entity
@Table(name = "employees")
@Getter
@Setter
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(mappedBy = "employee")
    @JsonBackReference
    private Set<Project> project = new HashSet<Project>();

    @OneToMany
    private Set<Status> status = new HashSet<Status>();
}

@Entity
@Table(name = "status")
public class Status {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id
    private String status; // completed, in progress, ... (think about making an enum)
    @ManyToOne
    private Employee employee;
    @ManyToOne
    private Project project;
}