我在删除联接表中引用的实体时遇到问题。以下是三个链接的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”中引用。
有人能帮忙吗?
嗯,当您只有一个客户对象时,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表仅没有外键。我想删除已通过项目中的帖子。 现在无法正常工作,因为没有帖子被删除。 问题答案: 您只需要指定要从表中删除条目: 编辑:有关更多信息,您可以看到此替代答案