Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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 如何从非所有者端使用Hibernate从@ManyToMany关联中删除关系?_Java_Hibernate_Jpa_Cascade - Fatal编程技术网

Java 如何从非所有者端使用Hibernate从@ManyToMany关联中删除关系?

Java 如何从非所有者端使用Hibernate从@ManyToMany关联中删除关系?,java,hibernate,jpa,cascade,Java,Hibernate,Jpa,Cascade,我有两个实体,它们由@manytomy关联。首先是关系的所有者。我需要更新第二个:将旧关系删除到第一个,并添加新关系 @Entity public class Person { @Id @GenericGenerator(name = "increment", strategy = "increment") @GeneratedValue(generator = "increment") @Column(name = "id") private Long id; @Co

我有两个实体,它们由
@manytomy
关联。首先是关系的所有者。我需要更新第二个:将旧关系删除到第一个,并添加新关系

@Entity
public class Person {
  @Id
  @GenericGenerator(name = "increment", strategy = "increment")
  @GeneratedValue(generator = "increment")
  @Column(name = "id")
  private Long id;

  @Column(name = "name")
  private String name;

  @ManyToMany
  @Cascade(CascadeType.SAVE_UPDATE)
  private Set<Group> groups;
}
@实体
公共阶层人士{
@身份证
@GenericGenerator(name=“increment”,strategy=“increment”)
@生成值(生成器=“增量”)
@列(name=“id”)
私人长id;
@列(name=“name”)
私有字符串名称;
@许多
@级联(级联类型。保存\更新)
私有集合组;
}
第二

@Entity
public class Group {
  @Id
  @GenericGenerator(name = "increment", strategy = "increment")
  @GeneratedValue(generator = "increment")
  @Column(name = "id")
  private Long id;

  @Column(name = "name")
  private String name;

  @ManyToMany(mappedBy = "groups")
  @Cascade(CascadeType.SAVE_UPDATE)
  private Set<Person> person;
}
@实体
公共课组{
@身份证
@GenericGenerator(name=“increment”,strategy=“increment”)
@生成值(生成器=“增量”)
@列(name=“id”)
私人长id;
@列(name=“name”)
私有字符串名称;
@许多(mappedBy=“组”)
@级联(级联类型。保存\更新)
私人设定人;
}
正如您所看到的,
人员
是此关系中的所有者。我需要更新一些组。在输入数据中,我收到
id和
个人
的id集,我需要将其添加到此
。以前,我需要从该
组中删除所有
人员
(仅从该
组中删除,而不是完全删除)。因此,我尝试清除
设置
人员,然后添加新人员,然后继续
。我也尝试着做同样的事情,但在清除一组人员后,以及在将新人员添加到此列表后,仍然坚持
Group
。在这两种情况下,只有新成员添加到
,而不从中删除旧成员

UPD


我知道两种方法:1运行本机SQL查询,2从所有者端删除关系。我将尝试找到最简单的方法

使用SQL做这件事要容易得多

DELETE from Person_Group where GroupId = ?  //Empty group
INSERT into Person_Group values (?,?)       //Add new member
INSERT into Person_Group values (?,?)       //Add new member
INSERT into Person_Group values (?,?)       //Add new member
...
我建议使用这种方法。它更容易实现


这样做的Hibernate是将所有人(包括旧组成员和新组成员)都存储在内存中(通过Id)并更新他们的成员身份

使用SQL做这件事要容易得多

DELETE from Person_Group where GroupId = ?  //Empty group
INSERT into Person_Group values (?,?)       //Add new member
INSERT into Person_Group values (?,?)       //Add new member
INSERT into Person_Group values (?,?)       //Add new member
...
我建议使用这种方法。它更容易实现


这样做的Hibernate是将所有人(包括旧组成员和新组成员)都存储在内存中(通过Id)并更新他们的成员身份

在JPA中,您需要维护双向关系的双方,因此最好的做法是不仅清除列表,而且检查并修改每个人,以便将该组从他们的列表中删除。因为这些人随后将从组中分离出来,所以您将需要单独合并每个更改,以便将其拾取。另一种方法是让Group.person集拥有该关系,以便对此集所做的更改控制数据库中的关系。缓存将不会被维护,而你在另一方面也有同样的问题。@Chris-我认为你的评论值得作为一个完整的答案来写。它解释了实体的面向对象方法和SQL的关系方法之间的差异,这在很多时候都没有实现。除了您的评论,还可以使用update调用JPQL查询,但它不会刷新已加载的人员实体。您需要在JPA中维护双向关系的双方,因此最好不要只清除列表,但要仔细检查并修改每个人,以便该组也从他们的列表中删除。因为这些人随后将从组中分离出来,所以您将需要单独合并每个更改,以便将其拾取。另一种方法是让Group.person集拥有该关系,以便对此集所做的更改控制数据库中的关系。缓存将不会被维护,而你在另一方面也有同样的问题。@Chris-我认为你的评论值得作为一个完整的答案来写。它解释了实体的面向对象方法和SQL的关系方法之间的差异,这在很多时候都没有实现。除了注释之外,还可以使用update调用JPQL查询,但它不会刷新已加载的个人实体。如果使用JPA/hibernate,最好使用等效的JPQL查询,以便利用对象关系绑定。如果使用JPA/hibernate,最好使用等效的JPQL查询,这样您就可以利用对象关系绑定。