Spring Data Repository不会删除ManyToOne Entity

我目前正在尝试使用Spring Data存储库来删除我的一些实体。 删除调用在没有任何exception/错误消息的情况下工作,但之后不会删除该实体。

这些是我的实体:

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 posts = new ArrayList(); } 

 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 { } 

删除调用类似于

 postRepository.delete(50); 

有什么想法为什么这种变化没有反映在数据库中?

编辑1:

我找到了一个解决方法,但我仍然不明白真正的问题是什么。 如果我像这样删除post,它会“有效”(由于约束违规而有一些例外,但邮件仍被删除):

 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在post上似乎是问题所在。 没有它,删除工作正常(但我现在错过了对post的级联更改)

问题似乎是你使用cascade=CascadeType.ALL ,它还包括CascadeType.PERSISTCascadeType.PERSIST表示子实体完全由父实体管理,您无法直接删除它。 要删除,只需将其从父项中删除即可。

您可以添加其他CascadeTypes而不是全部。 例如CascadeType.REMOVE ,如果你想要的唯一的东西是删除父项,如果父项被删除。

基于上面user2936091的优秀答案,我只想提一下我今天偶然发现的(相关)解决方法:如果未将父实体提取到Hibernate上下文中,则可以直接删除它。

在我的例子中,这是通过在@ManyToOne关系上设置fetch = FetchType.LAZY来实现的。 出于性能原因,我想要进行此更改,并注意到如果没有父母急切地获取Hibernate,可以通过存储库方法调用自由删除它。

这是因为你在Post类上设置了mappedBy =“board” ,这样你就知道Post的主人是Board。