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查询,这样您就可以利用对象关系绑定。