簡體   English   中英

當我嘗試刪除具有Hibernate的實體時,沒有錯誤消息但不刪除

[英]When I try delete a entity with Hibernate, there isn't a error message but doesn't delete

我有三個實體, BagItemCategory 一個Bag可以有很多Items ,很多Items可以有很多Categories

Bag <---- OneToMany ----> Item

Item ----- ManyToMany -----> Category

沒有必要在Category存儲items

當我嘗試刪除沒有categoriesItem ,沒有任何錯誤消息,但Item不會被刪除。 但是,如果我嘗試刪除DataBase中的相​​同item ,它將被成功刪除。

另一方面,如果我嘗試刪除帶有categoriesItem ,我收到此錯誤消息:

“無法刪除或更新父行:外鍵約束失敗( item_categories ,CONSTRAINT fk_item_categories_items_id FOREIGN KEY( items_id )REFERENCES itemid ))”。

我想刪除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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM