在Spring JPA中删除实体

时间:2019-03-24 11:40:37

标签: java spring hibernate entity

有两个具有@ManyToOne和@OneToMany关系的实体(类别和产品)。当我启用(cascade = CascadeType.ALL)时,“产品”中的一条记录将拉出以删除一个类别,即BAD。该实体必须做什么,结果是仅删除发生在一个地方(表),而没有级联(相关)删除以供另一参考?我正在使用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)     公共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);

}

1 个答案:

答案 0 :(得分:0)

解决了,我不知道为什么,但是在crudRepository方法中,deleteById(productId)仅与CascadeType.ALL一起使用,并且您删除了请求/ categories / {catId} / products / {productId中的所有(产品和类别记录) },这很糟糕。我只是删除(产品产品)和此删除产品。在{id}的情况下,只需通过id请求项目并获取它,然后删除即可。