当我尝试使用Hibernate删除实体时,没有错误消息但没有删除

编码器D:

我有三个实体BagItemCategory一个Bag可以有很多Items,很多Items可以有很多Categories

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

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

没必要itemsCategory

当我尝试删除一个Itemno时categories,没有任何错误消息,但是Item没有删除。但是,如果我尝试item在数据库中删除相同的内容,则会成功删除。

在另一方面,如果我尝试删除Itemcategories,我收到此错误信息:

“无法删除或更新父行:外键约束失败(item_categories,CONSTRAINT fk_item_categories_items_idFOREIGN KEY(items_id)参考itemid))”。

我想删除item和他的关系categories,但保留categories我该怎么办?

对于第一个问题,我尝试添加到delete方法中bag.removeItems(item),但是它仅删除两者与itemDB中continue 之间的关系

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();
    }

编辑:创建和更新的方法工作正常。

内斯特·索科尔(Nestor Sokil):

因此,问题是您通过中间(或关联)表解决了多对多关系,在该表中存储了对item-category对。当您删除项目时,将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中添加自定义方法

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

netplan 没有被应用,当我尝试应用它时我没有收到错误消息

MySQL删除没有错误的地方

当我尝试删除文件时,为什么Plupload容器没有响应?

当我尝试在Git中删除文件夹时,为什么没有“ pathspec”?

MVC 5 - 尝试使用 linq 删除一行时,没有错误并且该行未被删除。为什么?

列在那里,但是当我尝试删除它时,它说MYSQL中没有列?**错误代码:1091。无法删除... **

PHP删除表单不删除没有错误

当我向django添加新语言时,没有错误,但没有显示我的翻译。为什么?

无法在Windows 10中删除文件夹-没有错误消息

当我尝试从不存在的HashSet中删除元素时,为什么它没有给出运行时错误?

当我推入超过Vec容量的元素时,为什么没有错误?

我的junit测试中没有错误消息

PyQt:退出时没有错误消息(回溯)

MQTT paho - 发布消息失败时没有错误

查找和删除子目录没有错误?

cx_oracle-删除无效。没有错误或异常

当我尝试扩展模型属性时,为什么Visual Studio 2013调试器没有错误地关闭?

嘿!我正在尝试使用 C 中的链表尝试所有可能性,但是当我尝试删除第一个项目 (pop) 时,我不断收到错误消息

转换失败,没有错误消息

使用SQL从WordPress帖子中删除HTML失败而没有错误

MongoDB不删除行,使用C#驱动程序没有错误

当我删除一些内容并改变状态时,我的输入值没有改变

在C#中执行SQL查询时出错,当我手动输入它时没有错误

当我尝试在没有搜索查询的情况下查看页面时,无法使用无作为查询值错误

jQuery ON错误。使用LIVE时没有错误

当我尝试使用pgmpy实现MarkovModel时,有没有办法修复KeyError?

当我尝试运行代码时,Pygame窗口没有响应错误

为什么当我给 R 中的两个列表元素赋予相同的名称时没有错误

当我的应用程序在 android oreo 8.1 上崩溃时没有错误报告