簡體   English   中英

拯救雙方的多對多關系

[英]Saving Many-To-Many relations from both sides

我在這個問題上發現了許多有趣的答案,但其中沒有一個對我來說是正確的。

給定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);

按照我的方式,當測試的Employee有工作,但Job沒有任何Employee時,只有一側保存了ManyToMany。 休眠不應該照顧這個嗎?

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

我需要從兩側進行此操作,因此當首先保存Employee時,可以從Job端添加他。 通過,Cascade,我想我已經嘗試了其中的大多數。 另外-我嘗試了額外的“添加”方法,但在這種情況下無法正常工作,StackOverflowError ...

您為同一關系創建兩個不同的表。

如果要創建雙向ManyToMany關系,只需創建一個表,然后使用第二個集合,使用@ManyToMany批注的“ mappedBy”屬性

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

欲了解更多信息,請點擊這里

當添加注解@JoinTable時,您要告訴hibernate在2個實體之間創建一個聯結表。 雙方加總意味着雙重定義。 為什么這樣不好? 如果您有2種不同的定義,那么冬眠應該選擇哪一種?

您不必先保存工作,然后再保存員工,如果他們可以選擇級聯,則休眠將為您完成。

如何解決空問題? 如果您具有多對多關系,則意味着您具有雙向關系,並且它們之間應該相互引用。

   employee.getJobs().add(job);
   job.getEmployees().add(employee);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM