[英]When I try delete a entity with Hibernate, there isn't a error message but doesn't delete
我有三個實體, Bag
, Item
和Category
。 一個Bag
可以有很多Items
,很多Items
可以有很多Categories
:
Bag
<---- OneToMany
----> Item
Item
----- ManyToMany
-----> Category
沒有必要在Category
存儲items
當我嘗試刪除沒有categories
的Item
,沒有任何錯誤消息,但Item
不會被刪除。 但是,如果我嘗試刪除DataBase中的相同item
,它將被成功刪除。
另一方面,如果我嘗試刪除帶有categories
的Item
,我收到此錯誤消息:
“無法刪除或更新父行:外鍵約束失敗( item_categories
,CONSTRAINT fk_item_categories_items_id
FOREIGN KEY( items_id
)REFERENCES item
( id
))”。
我想刪除item
和他的categories
的關系,但保持categories
。 我怎么能這樣做?
對於第一個問題,我試圖添加到刪除方法bag.removeItems(item)
,但它只是刪除在兩者之間的關系里邊反和item
繼續DB。
Bag.java
@OneToMany(mappedBy = "bag", cascade = CascadeType.ALL, fetch=FetchType.EAGER)
@JsonIgnoreProperties("bag")
private Set<Item> items = new HashSet<>();
Item.java
@ManyToOne
@JsonIgnoreProperties("items")
private Bag bag;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "item_categories",
joinColumns = @JoinColumn(name="items_id", referencedColumnName="id"),
inverseJoinColumns = @JoinColumn(name="categories_id", referencedColumnName="id"))
private Set<Category> categories = new HashSet<>();
ItemResource.java
@DeleteMapping("/items/{id}")
@Timed
public ResponseEntity<Void> deleteItem(@PathVariable Long id) {
itemRepository.delete(id);
return ResponseEntity.ok().headers(HeaderUtil.createEntityDeletionAlert(ENTITY_NAME, id.toString())).build();
}
編輯:創建和更新的方法工作正常。
所以問題在於你是一個多對多的關系,它由中間(或關聯)表解決,其中存儲了對項目 - 類別。 刪除項時,將執行實際的DELETE FROM item
查詢,但由於存在外鍵約束而不允許相應的對保持孤立狀態,因此它會失敗。
要解決這個問題,您可以自己刪除關聯:
item.getCategories().clear();
至於必須執行此代碼的位置,這取決於您。 您可以在Item中創建一個鈎子,如下所示:
@PreRemove
private void deleteCategories() {
this.getCategories().clear();
}
或者你可以創建一個類似的ItemService
public void deleteItem(Long id) {
final Item item = itemRepository.findById(id);
// you can handle here when not found, which is a good thing to do
item.getCategories().clear();
itemRepository.deleteItem(item);
}
或者您可以為JPA存儲庫實現一個自定義方法,我不喜歡,但您可以在此處閱讀如何向Spring Data JPA添加自定義方法 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.