繁体   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