如何在不删除实际目标实体的情况下删除@ManyToMany关联(链接链接)

我们是博格

我正在开发Spring-MVC应用程序,并且其中有多对多映射。有3个表,一个是GroupAccount,memberjunction,GroupMembers。现在,当我删除groupMember时,我只想从GroupMembers和与memberId对应的memberjunction中删除条目。我尝试使用Cascade.Remove,它也导致了GroupAccount的删除。我正在发布我的sql代码,以及到目前为止的内容。

SQL代码:

CREATE TABLE groupaccount
(
  groupid numeric NOT NULL,
  groupname character varying,
  adminusername character varying,
  CONSTRAINT groupid PRIMARY KEY (groupid)
)
CREATE TABLE memberjunction
(
  memberid integer NOT NULL,
  groupid numeric NOT NULL,
  CONSTRAINT membergroupid PRIMARY KEY (memberid, groupid),
  CONSTRAINT groupaccount_memberjunction_fk FOREIGN KEY (groupid)
      REFERENCES groupaccount (groupid) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT groupmembers_memberjunction_fk FOREIGN KEY (memberid)
      REFERENCES groupmembers (memberid) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
CREATE TABLE groupmembers
(
  memberid integer NOT NULL,
  musername character varying,
  accesslevel boolean DEFAULT true,
  CONSTRAINT memberid PRIMARY KEY (memberid)
)

GroupMembersDAOImpl删除方法:

@Override
public boolean removeGroupMember(int memberId) {
    session = sessionFactory.getCurrentSession();
    GroupMembers groupMembers = (GroupMembers) session.get(GroupMembers.class, memberId);
    if(!(groupMembers == null)){
        groupMembers.getGroupAccounts().clear();
        session.flush();
        session.delete(groupMembers);
        return true;
    } else {
        return false;
    }
}

GroupAccount实体:

@Entity
@Table(name="groupaccount")
public class GroupAccount {
 @Id
    @Column(name="groupid")
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "groupaccount_seq_gen")
    @SequenceGenerator(name = "groupaccount_seq_gen",sequenceName = "groupaccount_seq")
    private Long groupId;
 @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "memberjunction", joinColumns = {@JoinColumn(name = "groupid")},
                inverseJoinColumns = {@JoinColumn(name = "memberid")})
    private Set<GroupMembers> groupMembersSet = new HashSet<>();

    public void setGroupMembersSet(Set<GroupMembers> groupMembersSet){
        this.groupMembersSet = groupMembersSet;
    }

    public Set<GroupMembers> getGroupMembersSet(){
        return this.groupMembersSet;
    }
}

GroupMembers实体:

@Entity
@Table(name="groupmembers")
public class GroupMembers {

 @Id
    @Column(name="memberid")
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "groupmembers_seq_gen")
    @SequenceGenerator(name = "groupmembers_seq_gen",sequenceName = "groupmembers_seq")
    private int memberid;
 @ManyToMany(mappedBy = "groupMembersSet")
    private Set<GroupAccount> groupAccounts = new HashSet<>();

    public void setGroupAccounts(Set<GroupAccount> groupAccounts){
        this.groupAccounts = groupAccounts;
    }

    public Set<GroupAccount> getGroupAccounts(){
        return this.groupAccounts;
    }
}

最新错误日志:

org.postgresql.util.PSQLException: ERROR: update or delete on table "groupmembers" violates foreign key constraint "groupmembers_memberjunction_fk" on table "memberjunction"
  Detail: Key (memberid)=(2501) is still referenced from table "memberjunction".
    org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2198)
    org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1927)

上面的方法无法正常工作,正如它说的那样,有对memberJunction的引用。我如何也查询memberJunction并删除与memberId对应的条目。你能帮忙的话,我会很高兴。非常感谢.. :-)

弗拉德·米哈尔西娅

您需要执行以下操作:

for(GroupAccount groupAccount : groupMembers.getGroupAccounts()) {
    groupAccount.getGroupMembersSet().remove(this);
}
groupMembers.getGroupAccounts().clear();
session.flush();
session.delete(groupMembers);

因为您具有@ManyToMany关联,所以关联表在运行时不可用。为此,您可以:

  1. 在删除GroupMembers之前清除GroupAccountsfrom GroupMembers确保刷新,以确保delete操作不会阻止对可删除实体状态的更新。

  2. 您可以将替换为@ManyToMany实体@OneToMany关联MemberJunction(其PK / @ Id是通过GroupMembers构建的GroupAccount)。这样,您可以将Delete from层叠GroupMembersMemberJunction mappedBySet中,因为它将删除关联表中的行,而不是实际的GroupAccount实体。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在不删除的情况下更改符号链接的目标

来自分类Dev

如何在不删除依赖的情况下删除deb

来自分类Dev

如何在不删除依赖的情况下删除deb

来自分类Dev

如何删除符号链接的目标而不删除链接本身?

来自分类Dev

如何删除符号链接的目标而不删除链接本身?

来自分类Dev

如何在不删除实际程序的情况下删除桌面快捷方式-W10

来自分类Dev

如何在不删除具有多对多关系的ember中的记录的情况下删除关联?

来自分类Dev

如何在不删除约束的情况下“禁用”它们?

来自分类Dev

如何在不删除约束的情况下“禁用”它们?

来自分类Dev

如何在不删除的情况下进行zip压缩?

来自分类Dev

如何在不删除 Windows 的情况下安装 Ubuntu?

来自分类Dev

删除软链接,但不删除目标

来自分类Dev

如何在不丢失原始文件的情况下删除ubuntu上的硬链接?

来自分类Dev

如何在不删除Gnome的情况下删除主显节?

来自分类Dev

如何在不删除元素的情况下删除jQuery UI元素?

来自分类Dev

PHP Storm:如何在不删除文件的情况下删除项目

来自分类Dev

如何在不删除Linux本身的情况下删除最新内核

来自分类Dev

如何在不删除子级的情况下删除包装器(父元素)?

来自分类Dev

如何在不删除括号的情况下删除括号内的内容

来自分类Dev

如何在不删除元素的情况下删除jQuery UI元素?

来自分类Dev

如何在不删除括号的情况下删除括号内的内容

来自分类Dev

如何在不删除Linux本身的情况下删除最新内核

来自分类Dev

如何在不删除Gnome的情况下删除主显节?

来自分类Dev

如何在不删除其他重要系统组件的情况下删除线性调频?

来自分类Dev

如何在不删除Linux中其他行的情况下删除标题?

来自分类Dev

PHP Storm:如何在不删除文件的情况下删除项目

来自分类Dev

如何在不删除弹性搜索数据的情况下删除索引的默认映射

来自分类Dev

如何在不删除不包含CDATA的元素的情况下删除CDATA?

来自分类Dev

如何在不删除指定文件的情况下反转目录中的删除文件

Related 相关文章

  1. 1

    在不删除的情况下更改符号链接的目标

  2. 2

    如何在不删除依赖的情况下删除deb

  3. 3

    如何在不删除依赖的情况下删除deb

  4. 4

    如何删除符号链接的目标而不删除链接本身?

  5. 5

    如何删除符号链接的目标而不删除链接本身?

  6. 6

    如何在不删除实际程序的情况下删除桌面快捷方式-W10

  7. 7

    如何在不删除具有多对多关系的ember中的记录的情况下删除关联?

  8. 8

    如何在不删除约束的情况下“禁用”它们?

  9. 9

    如何在不删除约束的情况下“禁用”它们?

  10. 10

    如何在不删除的情况下进行zip压缩?

  11. 11

    如何在不删除 Windows 的情况下安装 Ubuntu?

  12. 12

    删除软链接,但不删除目标

  13. 13

    如何在不丢失原始文件的情况下删除ubuntu上的硬链接?

  14. 14

    如何在不删除Gnome的情况下删除主显节?

  15. 15

    如何在不删除元素的情况下删除jQuery UI元素?

  16. 16

    PHP Storm:如何在不删除文件的情况下删除项目

  17. 17

    如何在不删除Linux本身的情况下删除最新内核

  18. 18

    如何在不删除子级的情况下删除包装器(父元素)?

  19. 19

    如何在不删除括号的情况下删除括号内的内容

  20. 20

    如何在不删除元素的情况下删除jQuery UI元素?

  21. 21

    如何在不删除括号的情况下删除括号内的内容

  22. 22

    如何在不删除Linux本身的情况下删除最新内核

  23. 23

    如何在不删除Gnome的情况下删除主显节?

  24. 24

    如何在不删除其他重要系统组件的情况下删除线性调频?

  25. 25

    如何在不删除Linux中其他行的情况下删除标题?

  26. 26

    PHP Storm:如何在不删除文件的情况下删除项目

  27. 27

    如何在不删除弹性搜索数据的情况下删除索引的默认映射

  28. 28

    如何在不删除不包含CDATA的元素的情况下删除CDATA?

  29. 29

    如何在不删除指定文件的情况下反转目录中的删除文件

热门标签

归档