0

我在这个主题中找到了许多有趣的答案,但没有一个对我来说是正确的。

给定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... };

我需要从双方都这样做,所以当首先保存 Employee 时,您可以从 Job 端添加他。MappedBy,Cascade,我想我已经尝试了其中的大部分。另外-我尝试了额外的“添加”方法,但在这种情况下它不起作用,StackOverflowError ...

4

2 回答 2

0

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

如果要创建双向多对多关系,只需创建一个表,并在第二个集合中使用@ManyToMany注释的“mappedBy”属性

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

欲了解更多信息,请查看这里

于 2018-10-13T15:25:22.543 回答
0

当您添加注解@JoinTable 时,您是在告诉 hibernate 在 2 个实体之间创建一个联结表。在两侧添加将意味着双重定义。为什么这很糟糕?如果你有 2 个不同的定义,hibernate 应该选择哪一个?

您不必先保存工作,然后再保存员工,如果他们有级联选项,hibernate 会为您完成。

如何解决空问题?如果你有多对多的关系,这意味着你有一个双向的关系,它们应该相互引用。

   employee.getJobs().add(job);
   job.getEmployees().add(employee);
于 2018-10-13T23:18:39.027 回答