在 Spring JPA 中删除实体
Posted
技术标签:
【中文标题】在 Spring JPA 中删除实体【英文标题】:Deleting entity in Spring JPA 【发布时间】:2019-08-14 20:15:53 【问题描述】:有两个实体具有关系 @ManyToOne 和 @OneToMany(类别和产品)。当我启用(cascade=CascadeType.ALL)时,Products 中的一条记录用于删除一个类别,这很糟糕。对于结果仅在一个地方(表)发生删除而没有级联(相关)删除以供另一个参考的实体,必须做什么???我使用的是 Spring 5.1.5(不是 Spring Boot) 谢谢!
SPRING 5 / TOMCAT 9 / JACKSON-DATABIND / spring-data-jpa 2.1.5 / persistence-api 1.0.2 / Hibernate-core 5.4.1
@实体 公共类类别
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="CAT_ID")
private Long id;
@Column(name="CAT_NAME")
private String name;
@JsonManagedReference
@OneToMany(cascade=CascadeType.ALL,fetch = FetchType.EAGER)
@JoinColumn(name="CAT_ID")
@OrderBy
private Set<Product> products = new HashSet<>();
public Long getId()
return id;
@实体 公共类产品
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="PRODUCT_ID")
private Long id;
@Column(name="PRODUCT_NAME")
private String name;
@JsonBackReference
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="CAT_ID")
private Category category;
public Long getId()
return id;
@RequestMapping(value="/categories/categoryId/products/productId", method=RequestMethod.DELETE) public ResponseEntity deleteById(@PathVariable Long categoryId, @PathVariable Long productId) productService.deleteProductById(productId); 返回新的 ResponseEntity(HttpStatus.OK);
@Transactional
@Override
public void deleteProductById(Long productId)
// TODO Auto-generated method stub
productRepository.deleteById(productId);
【问题讨论】:
我不确定我是否理解您想要达到的目标?您是否尝试在不使用(cascade=CascadeType.ALL)
的情况下删除两个链接实体?
好吧,不要在 Product.category 上设置 cascade=CascadeType.ALL,因为这正是删除产品时删除类别的原因,您不希望这种情况发生。您发布的代码在删除产品时不会删除类别,所以我不确定您的问题是什么。
当我发送 DELETE localhost:8080/spring-mvc-app/categories/1/products/1 时,我想删除产品 1(one) not(No) category1(ONE)
你的代码应该这样做。它实际上是做什么的?您发布的代码的具体问题是什么?
localhost:8080/spring-mvc-app/categories/1/products/1 - 没有影响。但是当我为产品实体添加 cascade=CascadeType.ALL 时,我得到了 detele 添加产品和相关类别。我只想删除产品没有类别。该怎么做?
【参考方案1】:
已解决,我不知道为什么,但在 crudRepository 方法中,deleteById(productId) 仅适用于 CascadeType.ALL 并且您删除了请求 /categories/catId/products/productId 中的所有(产品和类别记录) 这很糟糕。我只是删除(产品产品)和这个删除产品。在 id 的情况下,只需按 id 请求项目并得到它,然后删除。
【讨论】:
以上是关于在 Spring JPA 中删除实体的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Boot 中使用 JPA 从具有 OneToMany 关系的实体中删除对象
在 JPA/Hibernate 中使用 @OnetoMany 的实体中不存在时从数据库中删除子记录(Spring 引导应用程序)
Spring Boot-------JPA——EntityManager构建通用DAO