【问题标题】:Deleting entity in Spring JPA在 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 添加产品和相关类别。我只想删除产品没有类别。该怎么做?

标签: java spring hibernate entity


【解决方案1】:

已解决,我不知道为什么,但在 crudRepository 方法中,deleteById(productId) 仅适用于 CascadeType.ALL 并且您删除了请求 /categories/{catId}/products/{productId 中的所有(产品和类别记录) } 这很糟糕。我只是删除(产品产品)和这个删除产品。在 {id} 的情况下,只需按 id 请求项目并得到它,然后删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2020-03-17
    • 2017-12-11
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多