拯救双方的多对多关系

时间:2018-10-13 15:03:10

标签: java spring hibernate jpa

我在这个问题上发现了很多有趣的答案,但其中没有一个对我来说是正确的。

给出 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 ...

2 个答案:

答案 0 :(得分:0)

您为同一关系创建两个不同的表。

如果要创建双向ManyToMany关系,只需创建一个表,然后使用第二个集合,使用 @ManyToMany 批注

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

有关更多信息,请检查HERE

答案 1 :(得分:0)

添加注释@JoinTable时,是在告诉hibernate在2个实体之间创建连接表。双方加总意味着双重定义。为什么这样不好?如果您有2种不同的定义,冬眠应该选择哪一种?

您不必先保存工作,然后再保存雇员,如果他们可以选择级联,则休眠将为您完成。

如何解决null问题? 如果您具有多对多关系,则意味着您具有双向关系,并且它们之间应该有相互引用。

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