我正在尝试删除父学生或家长课程,我收到此错误:
引起:org.postgresql.util.PSQLException:错误:表“学生”上的更新或删除违反了“注册”表中的外键约束“fkeyvuofq5vwdylcf78jar3mxol”
RegistrationId类是注册类中使用的复合键。我正在使用Spring数据jpa和spring boot。
我做错了什么?我知道把cascadetype.all放在删除父节点时也应删除子节点但是它给了我一个错误。
@Embeddable
public class RegistrationId implements Serializable {
@JsonIgnoreProperties("notifications")
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "student_pcn", referencedColumnName="pcn")
private Student student;
@JsonIgnoreProperties({"teachers", "states", "reviews"})
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "course_code", referencedColumnName="code")
private Course course;
注册课程
@Entity(name = "Registration")
@Table(name = "registration")
public class Registration {
@EmbeddedId
private RegistrationId id;
答案 0 :(得分:6)
我通过使用hibernate @OnDelete注释使其工作。一些JPA.persistence CascadeTypes如何工作。它们对我选择的任何一个都没有影响。
就像下面一样。现在我可以删除父学生或父课程,并删除所有孩子(注册)。
@Embeddable
public class RegistrationId implements Serializable {
@JsonIgnoreProperties("notifications")
@OnDelete(action = OnDeleteAction.CASCADE)
@OneToOne
@JoinColumn(name = "student_pcn", referencedColumnName="pcn")
private Student student;
@JsonIgnoreProperties({"teachers", "states", "reviews"})
@OnDelete(action = OnDeleteAction.CASCADE)
@OneToOne
@JoinColumn(name = "course_code", referencedColumnName="code")
private Course course;
答案 1 :(得分:4)
当您使用关系数据库时,您正在设置具有这些实体之间关系的实体。
您获得的错误意味着:
您尝试删除其主键在另一个表中作为外键运行的记录,因此您无法将其删除。
要删除该记录,首先,使用外键删除记录,然后删除要删除的原始记录。
答案 2 :(得分:1)
外键保证条目将存在于另一个表中。这是一种确保数据完整性的方法。 SQL将永远不允许您删除此条目,而它仍然在另一个表中删除。要么(1)这是让你知道你会犯一个严重的错误,删除这个必要的东西或(2)你想进行级联删除,这样不仅这个条目被删除,但是这是假设的在另一个表中引用它。有关级联删除的信息可以在这里找到并且相当容易编写(https://www.techonthenet.com/sql_server/foreign_keys/foreign_delete.php)。如果这两个描述都不适合你,那么首先要评估你的外键关系存在的原因,因为它可能不应该。