当前位置: 首页 > 面试题库 >

Spring Data Repository不会删除ManyToOne实体

孟思远
2023-03-14
问题内容

我目前正在尝试使用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.PERSISTCascadeType.PERSIST表示子实体完全由父实体管理,您不能直接删除它。为了删除,您只需要将其从父级中删除。

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



 类似资料:
  • 我的实体。ValidationStep与documentDetail有一对一的关系,documentDetail与documentValidations有一个完全的关系 我的删除查询 父ValidationStep被删除,但是docDetail和documentValidations仍然在数据库中。

  • 我正在用Java、Spring和JPA开发一个web应用程序。我有这两个实体,它们代表一个用户及其后续通知。当一个用户跟踪另一个用户时,被跟踪的用户将收到一个follow通知。 我想删除User并删除它的所有通知,但我想保留通知的引用用户,也就是开始跟踪主用户的用户。唯一的问题是,当我尝试删除用户时,会出现以下错误: com.mysql.jdbc.exceptions.jdbc4.mysqlint

  • 删除父实体时,我还想删除关联的子实体(从数据库中)。我试图在删除时使用级联,如下所示,但我一定做错了什么。 当对父实体对象调用删除时,我收到错误消息:“该实体仍在数据库的其他地方引用”。我可以确认该实体在数据库的其他地方引用的唯一地方是在下面的两个表中(如果我手动从数据库中删除子行,对父实体对象的删除调用工作正常)。在过去的9个小时里,我一直在阅读实体对象并尝试不同的东西。我做错了什么? 这是我的

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 项目类别: 主屏幕类别: 日志:第一次单击开始时:(计时器完成后) 单击调试按钮后(清除数组列表): 再次点击开始按钮后:(计时器完成后) 您可以看到ArrayList中的项目没有被清除。它增加了。我认为这是因为在spawnItem()中创建的Item实例仍然存在。我该如何解决这个问题? 我注意到每次我点击按钮都没有更多的项目。项目产生得更快。但是如何阻止这种情况呢?

  • 问题内容: 具有以下内容: 这是否意味着删除User对象会删除与其关联的Institution对象?如果是这种情况,我将不遵循为什么需要这样做。例如说该机构有很多用户。这是否意味着删除这些用户之一会删除该机构,在这种情况下,所有其他用户也会丢失该机构? 问题答案: 没错,很少(如果曾经)需要将CascadeType.REMOVE与ManyToMany或ManyToOne一起使用。在JPA 2.0规