当前位置: 首页 > 知识库问答 >
问题:

正在从联接表中删除实体。SpringJPA

呼延英奕
2023-03-14

我在删除联接表中引用的实体时遇到问题。以下是三个链接的enitie。

@Getter
@Setter
@Entity(name = "guest_group")
public class GuestGroup {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "guest_group_id", nullable = false)
  private Long id;

  @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
  @JoinTable(
          name = "guest_group_join",
          joinColumns = @JoinColumn(name = "guest_group_id"),
          inverseJoinColumns = @JoinColumn(name = "guest_id")
  )
  @OrderColumn(name = "index")
  private Set<Guest> guests;

  @OneToOne(cascade = CascadeType.ALL)
  private NoteGroup noteGroup;

  public void addGuest(Guest guest) {
    this.guests.add(guest);
  }

  public void removeGuest(Guest guest) {
    this.guests.remove(guest);
  }
}
@Getter
@Setter
@Entity(name = "note_group")
public class NoteGroup {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "note_group_id", nullable = false)
  private Long id;

  @ManyToMany(cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
  @JoinTable(
          name = "note_group_join",
          joinColumns = @JoinColumn(name = "note_group_id"),
          inverseJoinColumns = @JoinColumn(name = "note_id")
  )
  @OrderColumn(name = "index")
  private Set<Note> notes;
}
@Getter
@Setter
@Entity
public class Guest {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id", nullable = false)
  private Long id;

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

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

  @Column(name = "phone_number")
  private String phoneNumber;
}

当我尝试使用CrudRepository从来宾表中删除来宾时,它会给我这个错误。

错误:表“guest”上的更新或删除违反了表“guest\u group\u join”上的外键约束“FKKOUGVMCU860MOUACR1SHJXY”。键(id)=(4)仍然从表“guest\u group\u join”中引用。

有人能帮忙吗?

共有1个答案

孔欣荣
2023-03-14

嗯,当您只有一个客户对象时,hibernate没有任何关于依赖关系的信息,所以这是不可能的。呸,因为这是一种多人的关系,所以总是需要对删除进行特殊处理。

一种方法,在不改变映射的情况下,可以在存储库中删除一个来宾,根据您拥有的来宾找到GuestGroup,并在那里将其删除(这可能适用于您的级联REMOVE,尽管测试它以确保只有您期望的对象以这种方式被删除-它可能会级联到分配了该来宾的每个组)。

更安全的方法可能是使映射具有双向性,删除级联删除,并实现方法(在存储库或实体本身中)以安全地添加和删除,如下所示:

@Entity
public class Guest {

  @ManyToMany(mappedBy = "guests")
  private List<GuestGroup> guestGroups = new ArrayList<GuestGroup>();

  ...
  
  public void addGuestGroup(GuestGroup group) {
      this.guestGroups.add(group);
      group.getGuests().add(this);
  }

  public void removeGuestGroup(GuestGroup group) {
      this.guestGroups.remove(group);
      group.getGuests().remove(this);
  }
}

如果需要的话,在关系的另一边对称放置。

 类似资料:
  • 问题内容: 我有一个Delphi应用程序,其中显示了像这样的查询已玩过的游戏的列表: 当我单击DBNavigator中的删除按钮时,也会删除game_types表中的联接记录。这是一个问题,因为许多其他游戏可以是同一类型。 我需要做些什么才能删除游戏,而不删除游戏类型? 问题答案: 您需要使用“唯一表”动态属性 从MSDN ADO文档 如果设置了“唯一表”动态属性,并且Recordset是对多个表

  • 问题内容: 我试图根据另一个数据库的选择标准从一个数据库中删除记录。我们有两个表,emailNotification,用于存储作业和电子邮件列表。然后我们有工作。我想清除已关闭作业的emailNotifications。我在Stackoverflow上找到了一些较早的示例,这些示例将我带到了这种语法类型(我以前曾尝试在where之前进行连接)。 我收到错误消息,您无法在FROM子句中指定目标表’e

  • 代码: 三个问题: > 我必须放置<code>CascadeType吗。在两个实体中删除?我希望它能正常工作,这样如果我删除了老师,课程就会自动删除。 在我的数据库中,我的id无法正常工作。我希望它使id每次增加一个,但它目前增加了一些随机数。为什么呢? 我还有两个类,但有关系。当我想在数据库中持久化一个新对象时,我必须做什么?

  • 问题内容: 我有两个表来包含国家/地区的州(state_table)和城市(city_table) 城市表具有state_id以便将其与state_table相关联 两个表中已经有数据。 现在的问题 城市表包含一个州内一个城市的多个条目。另一个城市可能也可能没有相同的城市名称 例如:cityone将在city表中使用stateone出现5次,使用statetwo出现2次 那么,我将如何编写查询以为

  • 在mysql工作台中,我试图执行 这是一个查询,但是我收到了这个消息 错误代码:1175。您使用的是安全更新模式,并且您试图更新一个没有使用键列禁用安全模式的表,请在“首选项”中切换该选项-

  • 问题内容: 这是创建我的表的脚本: 在我的PHP代码中,删除客户端时,我要删除所有项目帖子: posts表仅没有外键。我想删除已通过项目中的帖子。 现在无法正常工作,因为没有帖子被删除。 问题答案: 您只需要指定要从表中删除条目: 编辑:有关更多信息,您可以看到此替代答案