我有三个实体Bag
,Item
和Category
。一个Bag
可以有很多Items
,很多Items
可以有很多Categories
:
Bag
<---- OneToMany
---->Item
Item
----- ManyToMany
----->Category
没必要items
在Category
当我尝试删除一个Item
no时categories
,没有任何错误消息,但是Item
没有删除。但是,如果我尝试item
在数据库中删除相同的内容,则会成功删除。
在另一方面,如果我尝试删除Item
有categories
,我收到此错误信息:
“无法删除或更新父行:外键约束失败(item_categories
,CONSTRAINT fk_item_categories_items_id
FOREIGN KEY(items_id
)参考item
(id
))”。
我想删除item
和他的关系categories
,但保留categories
。我该怎么办?
对于第一个问题,我尝试添加到delete方法中bag.removeItems(item)
,但是它仅删除两者与item
DB中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();
}
编辑:创建和更新的方法工作正常。
因此,问题是您通过中间(或关联)表解决了多对多关系,在该表中存储了对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] 删除。
我来说两句