Hibernate Many to Many сопоставление, обновление одного и того же дочернего элемента у нескольких родителей - PullRequest
0 голосов
/ 27 мая 2020

Я создал две сущности: Project и Employee. В одном проекте может быть несколько сотрудников, в нескольких проектах может быть несколько сотрудников, поэтому я выбрал отношения 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 проекта с идентификаторами 1 и 2, 4 сотрудника с идентификаторами 1,2,3,4.

сотрудник 1,2, 3 являются частью первого проекта. Сотрудник 2, 3, 4 являются частью второго проекта.

Сотрудник 2 завершил первый проект, поэтому статус объекта сотрудника должен быть завершен для первого проекта Сотрудник 2 заблокирован во втором проекте, чтобы статус объекта сотрудника должен быть заблокирован для второго проекта

Итак, проблема, с которой я столкнулся, заключается в том, что если я обновляю статус сотрудника 2 для первого проекта, то же самое будет отображаться и для второго проекта, а также наоборот.

Итак, как Чтобы решить эту проблему, нужно ли мне создать отдельную сущность для статуса, добавив сопоставление сотрудников и проекта.

1 Ответ

1 голос
/ 27 мая 2020

Сотрудник 2, который работает в первом и втором проекте, всегда является одной и той же записью. Когда вы обновляете статус сотрудника, он будет обновлен для обоих проектов, потому что оба проекта используют одну и ту же запись.

Если вы хотите продолжить, этот сотрудник 2 завершил свою работу по проекту 1, но все еще работает над для проекта 2 вам нужна отдельная таблица, в которой сохраняется информация о статусе, идентификаторе сотрудника и идентификаторе проекта

@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;
}
...