我无法删除具有多个 * 子 * 实体(产品)的 * 父 * 实体(类别)
我不希望执行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();
.....
}
1条答案
按热度按时间7z5jn7bk1#
我重新创建了该问题,发现发生了约束冲突,因为您将category设置为updateable = false。需要删除此问题。