[英]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.