我目前正在尝试使用Spring Data存储库来删除一些实体。Delete调用可以正常工作,没有任何异常/错误消息,但是此后不会删除该实体。
这些是我的实体:
public class Board implements Serializable { @Id @GeneratedValue(generator = "uuid2") @GenericGenerator(name = "uuid2", strategy = "uuid2") @Column(columnDefinition = "BINARY(16)") private UUID uuid; @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval = true, mappedBy = "board") private List<Post> posts = new ArrayList<Post>(); }
和
public class Post implements Serializable { @Id @GeneratedValue private long id; @ManyToOne(optional = false) @JoinColumn(name="board_uuid", updatable = false, nullable = false) @JsonBackReference private Board board; }
该存储库非常简单:
@Repository public interface PostRepository extends CrudRepository<Post, Long> { }
删除呼叫就像
postRepository.delete(50);
有什么想法为什么这种变化没有反映在数据库中?
编辑1:
我找到了解决方法,但我仍然不明白真正的问题是什么。如果我这样删除帖子,它“起作用”(由于违反约束,有几个例外,但帖子仍被删除):
post.setBoard(null); postRepo.delete(post);
编辑2:
当我查看执行的SQL语句时,我可以看到hibernate甚至没有尝试删除。唯一发生的是这两个select语句:
Hibernate: select post0_.id as id1_1_0_, post0_.board_uuid as board_uu6_1_0_, post0_.content as content2_1_0_, post0_.x as x3_1_0_, post0_.y as y4_1_0_, post0_.z as z5_1_0_, board1_.uuid as uuid1_0_1_ from Post post0_ left outer join Board board1_ on post0_.board_uuid=board1_.uuid where post0_.id=? Hibernate: select posts0_.board_uuid as board_uu6_0_0_, posts0_.id as id1_1_0_, posts0_.id as id1_1_1_, posts0_.board_uuid as board_uu6_1_1_, posts0_.content as content2_1_1_, posts0_.x as x3_1_1_, posts0_.y as y4_1_1_, posts0_.z as z5_1_1_ from Post posts0_ where posts0_.board_uuid=?
编辑3
原来岗位上的cascade = CascadeType.ALL似乎是问题所在。没有它,删除就可以正常工作(但是我现在错过了帖子的级联更改)
问题似乎是您在使用cascade=CascadeType.ALL,其中还包括CascadeType.PERSIST。CascadeType.PERSIST表示子实体完全由父实体管理,您不能直接删除它。为了删除,您只需要将其从父级中删除。
cascade=CascadeType.ALL
CascadeType.PERSIST
您可以添加其他CascadeTypes而不是全部。例如CascadeType.REMOVE,如果您唯一想做的就是在删除父母的情况下删除孩子。
CascadeTypes
CascadeType.REMOVE