Сохранение отношений «многие ко многим» с обеих сторон - PullRequest
0 голосов
/ 13 октября 2018

Я нашел много интересных ответов на эту тему, но ни один из них не является правильным для меня.

Заданная часть Job.java

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "company_employee",
        joinColumns = @JoinColumn(name = "job_id"),
        inverseJoinColumns = @JoinColumn(name = "employee_id"))
private Set<Employee> employees = new HashSet<>();

и часть Employee.java

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "company_employee",
        joinColumns = @JoinColumn(name = "employee_id"),
        inverseJoinColumns = @JoinColumn(name = "job_id"))
private Set<Job> jobs = new HashSet<>();

Как это не работает для обеих сторон?

Создание объектов:

Job job = job.builder().build();
jobRepository.save(job);

Employee employee = Employee.builder().jobs(Sets.newSet(job));
employeeRepository.save(employee);

Как я делаю это таким образом - ManyToMany спасла только одна сторона, когда у проверенного сотрудника есть работа, но у работы нет сотрудника.Разве Hibernate не позаботится об этом? `

job.getEmployees = null;
employee.getJobs = { ...job... };

Мне нужно, чтобы это было сделано с обеих сторон, поэтому, когда Сотрудник спасен первым, вы можете добавить его со стороны Работы.MappedBy, Каскад, я думаю, что я попробовал большинство из них.Кроме того - я попытался с дополнительным методом «добавить», но в этом случае он не работает, StackOverflowError ...

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Когда вы добавляете аннотацию @JoinTable, вы сообщаете hibernate о создании таблицы соединений между двумя сущностями.Добавление с обеих сторон будет означать двойное определение.Почему это плохо?Если у вас есть 2 разных определения, какое из них следует выбрать в режиме гибернации?

Вам не нужно сначала сохранять задания, а после сотрудников, если у них будет каскадная опция, hibernate сделает это за вас.

Как решить нулевую проблему?Если у вас есть отношения многие ко многим, это означает, что у вас есть двусторонние отношения, и они должны иметь ссылки друг на друга.

   employee.getJobs().add(job);
   job.getEmployees().add(employee);
0 голосов
/ 13 октября 2018

Вы создаете две разные таблицы для одного и того же отношения.

Если вы хотите создать двунаправленное отношение ManyToMany, просто создайте одну таблицу, а во второй коллекции используйте атрибут "mappedBy" из @ ManyToMany аннотация

     @ManyToMany(mappedBy="employees", cascade = CascadeType.ALL)
     private Set<Job> jobs = new HashSet<>();

Для получения дополнительной информации проверьте ЗДЕСЬ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...