JPA: обновить таблицу сопоставления в одиночку - PullRequest
0 голосов
/ 27 января 2020

У меня есть сущности Project и Employee, которые имеют отношение ManyToMany, как показано ниже.

@Entity
public class Project {
     @Id @GeneratedValue
     private int projectId;

     private String projectName;

     // has some additional columns

     @ManyToMany(mappedBy = "projects")
     private List<Employee> emp = new ArrayList<Employee> ();
     ....
     .....

 }


 @Entity
public class Employee {
     @Id @GeneratedValue
     private int id;
     private String firstName;
     private String lastName;

     @ManyToMany(cascade=CascadeType.ALL)
     List<Project> projects = new ArrayList<Project> ();

     ....
     ....
}

Когда я использую вышеуказанные сущности, JPA создает таблицу отображения Employee_Project, как показано ниже.

create table Employee_Project (emp_id integer not null, projects_projectId integer not null)

Мой вопрос: всякий раз, когда добавляется новый сотрудник, я хочу обновлять как таблицу сотрудников, так и таблицу отображения Employee_Project, предположим, что я знаю идентификатор проекта, которому я хотел бы сопоставить этого сотрудника. (не касаясь таблицы / сущности проекта, я имею в виду, почему я должен предоставить полный объект проекта, сохраняя при этом только сущность сотрудника, как я могу сделать это через jpa?)

1 Ответ

1 голос
/ 27 января 2020

Вам не нужно указывать весь объект Project. Используйте EntityManager.getReference(projectId) или JpaRepository.getOne(projectId).

Эти методы будут создавать прокси-объект с соответствующим идентификатором, а не загружать всю сущность Project из хранилища данных.

РЕДАКТИРОВАТЬ Ваш метод обслуживания должен выглядеть примерно так:

@Transactional
public void createEmployee(Employee employee, Long projectId) {
    employee.setProjects(List.of(projectRepository.getOne(projectId));
    employeeRepository.save(employee);
}

В качестве примечания CascadeType.ALL (в частности, потому что он включает CascadeType.MERGE и CascadeType.REMOVE) не имеет смысла для @ManyToMany. Если вы не планируете создать Project путем создания Employee, CascadeType.PERSIST также не имеет смысла.

...