我在这个问题上发现了很多有趣的答案,但其中没有一个对我来说是正确的。
给出 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 ...
答案 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);