在 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 关系的实体中删除对象

删除分离实体spring jpa Repository接口

在 JPA/Hibernate 中使用 @OnetoMany 的实体中不存在时从数据库中删除子记录(Spring 引导应用程序)

Spring Boot-------JPA——EntityManager构建通用DAO

如何在Spring Boot Application中使用JPA删除/ getList

如何使用 Spring Data JPA(Hibernate) 跨映射表过滤关联实体?