一尘不染

Spring Data Repository不会删除ManyToOne实体

hibernate

我目前正在尝试使用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似乎是问题所在。没有它,删除就可以正常工作(但是我现在错过了帖子的级联更改)


阅读 201

收藏
2020-06-20

共1个答案

一尘不染

问题似乎是您在使用cascade=CascadeType.ALL,其中还包括CascadeType.PERSISTCascadeType.PERSIST表示子实体完全由父实体管理,您不能直接删除它。为了删除,您只需要将其从父级中删除。

您可以添加其他CascadeTypes而不是全部。例如CascadeType.REMOVE,如果您唯一想做的就是在删除父母的情况下删除孩子。

2020-06-20