我想從我的表中刪除實體,並讓它自動刪除它的任何實體。如何自動刪除子實體?
例子:
class User {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user", orphanRemoval=true)
@OnDelete(action = OnDeleteAction.CASCADE)
List<Address> addresses;
}
當我刪除沒有地址的用戶,一切工作正常。還刪除地址而不刪除用戶的作品。
但如果我嘗試刪除仍具有一些地址的用戶,我越來越org.hsqldb.HsqlException
:
integrity constraint violation: foreign key no action; FK_ADDRESS_USER_ID table: ADDRESS
什麼可能是錯在這裏? 或者這是不支持的,我必須在刪除用戶之前首先明確刪除所有包含的對象Address
?
Hibernate是如何實現級聯的?我希望它只是在'orphanRemoval'爲true時自動刪除子實體。 – millimoose
如果在映射註釋中使用'cascade'設置級聯,則可以通過Hibernate(JPA)完成,但是如果使用@OnDelete,Hibernate將在創建表時設置約束,並且級聯將在數據庫上完成級別(SQL級聯刪除),而不是常規的Hibernate機制。這具有減少Hibernate發出的SQL語句數量的功能。至於'orphanRemoval',它被用來標記實體的刪除,當它從@OneToMany集合中刪除或者一個關聯的實體從@OneToOne關聯中取消引用時,如規範中指定的那樣。 – alterfox