【问题标题】:Delete from CrudRepository doesnt work on child object从 CrudRepository 中删除对子对象不起作用
【发布时间】:2019-03-26 14:19:53
【问题描述】:

我的 RestController 中有一个 DELETE 方法,需要从 Cart 中删除 CartItem 对象。它们使用 OneToMany 关系映射,在从 CrudRepository 调用 delete 方法后,该项目保留在数据库中,我没有收到任何错误...

我尝试将 CascadeType.ALL 删除到 CascadeType.REMOVE ,还尝试从 Principal 对象中获取购物车,还尝试了 deleteById(Long id) 和 delete(CartItem cartItem) ,但没有任何帮助,项目仍在数据库中。

//CartItem repository

public interface CartItemRepository extends CrudRepository<CartItem, Long> {

    CartItem getByCartItemId(Long id);

}

//Cart entity

@OneToMany(mappedBy = "cart", cascade = CascadeType.REMOVE, fetch = FetchType.EAGER)
private Set<CartItem> cartItems = new HashSet<>();

//CartItem entity

 @ManyToOne
 @JoinColumn(name = "cartId")
 @JsonIgnore
 private Cart cart;

//Rest method

 @RequestMapping(value = "remove/{cartItemId}", method = RequestMethod.DELETE)
 @ResponseStatus(value = HttpStatus.NO_CONTENT)
 public void removeItemFromCart(@PathVariable (value = "cartItemId") Long 
 cartItemId){
        cartItemRepository.deleteById(cartItemId);
  }

【问题讨论】:

  • 可能是个问题,因为您没有同步双向关系。如果您删除拥有双向关系的子实体的子实体,则必须确保将其从单端的集合中删除。有关更多详细信息,请阅读此article

标签: spring rest jpa


【解决方案1】:

orphanRemoval=true 选项添加到您的@OneToMany 注释

【讨论】:

  • 你的deleteById怎么样,你在事务中执行吗?
  • 它来自 CrudRepository 的内置方法,尝试过 @Transactional 但没有帮助..
猜你喜欢
  • 2018-11-21
  • 2016-08-14
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 2015-08-02
  • 2017-03-01
  • 1970-01-01
  • 2016-01-19
相关资源
最近更新 更多