2017-06-15 254 views
2

我試圖刪除父學生或家長當然,我得到這個錯誤:錯誤:更新或刪除表「表名」違反外鍵約束

引起:org.postgresql.util.PSQLException :錯誤:表「學生」上的更新或刪除違反了表「註冊」上的外鍵約束「fkeyvuofq5vwdylcf78jar3mxol」

RegistrationId類是註冊類中使用的組合鍵。我使用Spring數據jpa和spring引導。

我在做什麼錯?我知道把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; 

回答

2

我通過使用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; 
0

外鍵保證一個條目將在另一個表中。這是確保數據完整性的一種方法。 SQL將永遠不會允許您刪除此條目,同時它仍在另一個表中刪除。無論是(1)這是讓你知道你會犯一個嚴重的錯誤,刪除這個所需的東西或(2)你想放入一個級聯刪除,這樣不僅刪除了這個條目,而且是假設的在其他表中引用它。關於級聯刪除的信息可以在這裏找到並寫入相當容易(https://www.techonthenet.com/sql_server/foreign_keys/foreign_delete.php)。如果這兩個描述都不適合你,請評估爲什麼你的外鍵關係首先存在,因爲它可能不應該。

+0

感謝您的回答。基本上我想要的是在添加新註冊(學生和課程必須存在)時確保數據完整性,這就是爲什麼我使用這些外鍵。但是,通過放置cascadetype.all,當我刪除父母時,它應該把所有的孩子帶走。這就是我想要的。 – Merv

2

當您使用關係數據庫時,您正在設置具有這些實體之間關係的實體。

你得到這意味着錯誤:

你試圖刪除一條記錄,它的主鍵作爲另一個表的外鍵功能,因此,你可以不刪除它。

爲了刪除記錄,首先用外鍵刪除記錄,然後刪除要刪除的原件。

+0

感謝您的回答。你是對的。我可以這樣做。但它似乎是一種解決方法。因爲通過放置註釋cascade = cascadeType.all,當父項被刪除時是否應該刪除子項?這基本上是我想要它做的。刪除該父母駐留在其他表中的所有子女。 – Merv

+0

這不是一個解決方法,那就是你的錯誤意味着什麼。與級聯有關。所有,是的,它假設刪除關係中的另一個實體,而spring-data肯定會嘗試,但是,由於其他外鍵沒有這樣做。爲了實現你想要的,只需先刪除保存外鍵的實體。 –

+0

如果這有幫助,我會欣賞一個投票和回答標記。謝謝。 @Merv –