Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA/Hibernate关系在一个方向上工作_Java_Hibernate_Jpa - Fatal编程技术网

Java JPA/Hibernate关系在一个方向上工作

Java JPA/Hibernate关系在一个方向上工作,java,hibernate,jpa,Java,Hibernate,Jpa,我的父母和孩子之间有着多对多的关系 这是映射此关系的父类中的零件: @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinTable(name = "parents_children", joinColumns = { @JoinColumn(name = "PARENT_ID", nullable = false, updatable = false) },

我的父母和孩子之间有着多对多的关系

这是映射此关系的父类中的零件:

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "parents_children", 
            joinColumns = { @JoinColumn(name = "PARENT_ID", nullable = false, updatable = false) }, 
            inverseJoinColumns = { @JoinColumn(name = "CHILD_ID", nullable = false, updatable = false) })
protected Set<Child> children = new HashSet<Child>();
这将在db中正确更新,并将条目保存到
父项\u子项
表中

然而,当我试图从另一端做这件事时,我想从孩子们身上设置父母。如果我定义了
Set parents
,并且在我的
Children
类中定义了
updateParents()
方法,并且从数据库中加载了一个子项,将其定义为
child
,我尝试了以下方法:

public void updateParents() {
    Set<Parent> parents = //get this from somewhere

    child.setParents(parents);
    update();
}
public void updateParents(){
Set parents=//从某处获取此信息
孩子。父母(父母);
更新();
}
这是行不通的,我正试图找出原因。如果我将我的方法修改为:

public void updateParents() {
  Set<Parent> parents = //get this from somewhere

  for (Parent parent : parents) {
    parent.getChild().add(this);
  }
}
public void updateParents(){
Set parents=//从某处获取此信息
用于(父级:父级){
parent.getChild().add(此);
}
}
我在关系定义上做错了什么吗?我已经有一段时间没有使用Java了,我记不起这个了


有人能指出我做错了什么,这样我就可以将父对象添加到子对象中吗?

没有,您的定义没有问题。 问题是
children
是关联的拥有方,除非将该子项添加到该集合中,否则数据库将不会更新

您可以将
parents
更改为映射同一个表,即删除
mappedBy
,从而有效地使用两个单向关联,但在更新父级和子级时可能会导致问题

考虑这种情况:

  • 对象A有子对象B和子对象C
  • 对象B具有父对象A
  • 对象C没有父对象(A不在父对象集中)
您现在更新了A和C。C是否仍然是A的孩子?这些信息相互矛盾


为了解决这个问题,只有一方负责更新关系,在您的情况下,这将是一个(通过其
子项
集合)。

在JPA中,您负责管理关联的双方。这意味着您必须在关系的一侧显式设置一个字段,并在多个一侧向集合添加一个元素

例如,考虑<代码>学生<代码>实体,使用字段<代码>列表< /代码>,假设两个实体之间存在双向<代码> > OneToMany < /代码> /<代码> ManyToOne < /代码>关系,<代码>学生< /代码>和<代码>课程< /代码> .< 为

学生添加
课程
时,您将管理以下关系:

Course course = //findFromSomewhere;
Student student = //findEntity;

course.setStudent(student);
student.getCourses().add(course);
当从关系的反面持续时,您将以相同的方式管理实体

   course.setStudent(student);
   student.getCourses().add(course);
在一个实体上插入/更新字段并不意味着Hibernate/JPA会自动为您更新关系的另一端。这样持续不会更新关联的另一端:

   //This would fail to add the course to the students list of courses.
   course.setStudent(student);
   em.persist(course);
   course.setStudent(student);
   student.getCourses().add(course);
   //This would fail to add the course to the students list of courses.
   course.setStudent(student);
   em.persist(course);