spring-data-jpa 无法删除具有带外键约束的CrudRepository的实体

h5qlskok  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(258)

我无法删除具有多个 * 子 * 实体(产品)的 * 父 * 实体(类别
我不希望执行CASCADE删除操作。我希望在子实体(产品)中将外部关键字值设置为NULL。产品可以在没有类别的情况下存在。
就我所知,在Spring/JPA中实现这一点的唯一方法是遍历所有子对象,并将实体设置为null,从而使关系无效(这看起来很乏味......我知道!......当然应该有一个注解,就像CASCADE一样)。
我的方法如下所示:

public void deleteCategory(CategoryEntity categoryEntity) {
    CategoryEntity category= categoryRep.findByName(categoryEntity.getName());

    List<ProductEntity> ps = productRep.findByCategory(category);
    for (ProductEntity p : ps) {
        p.setCategory(null);
        productRep.save(p);
    }

    categoryRep.delete(category);
}
  • (产品代表和类别代表都是CrudRepository的实现)*

这应该可以工作,但我得到错误
引用完整性约束冲突:“FKQX 9 WIKKTSEV 17 CTU 0 KCPKRAFC:我的天啊!公共产品外键(类别)引用公共类别(CAT_ID)
所以基本上这似乎不起作用。
我是否在某处遗漏了一个提交或刷新?我是否在某处遗漏了一个事务注解?
据我所知,CRUDRepository的“保存”和“更新”都是事务性的,所以这段代码应该可以工作。
谢谢你!

***更新*以下是我的实体

@Data
@Entity
@Table(name = "category")
public class CategoryEntity {

    @Id
    @Column(name = "cat_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "name")
    private String name;
....
}

@Data
@Entity
@Table(name = "product")
public class ProductEntity {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    //TODO change cascade to nullable. products can also exist without a category
    @ManyToOne
    @JoinColumn(name = "category", nullable = true, updatable = false)
    private CategoryEntity category = new CategoryEntity();
.....

}
7z5jn7bk

7z5jn7bk1#

我重新创建了该问题,发现发生了约束冲突,因为您将category设置为updateable = false。需要删除此问题。

@ManyToOne
    @JoinColumn(name = "category")
    private CategoryEntity category = new CategoryEntity();

相关问题