【发布时间】: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