当前位置: 首页 > 知识库问答 >
问题:

Spring+Hibernate:无法删除单向关系中的子级

元胡媚
2023-03-14

我试着在这里找到类似的问题,我在这里找到了这个,但它没有太大的帮助。

这正是我的问题所在。问题是@ondelete迫使我建立双向关系,对吗?如果可能的话,我想保持单向性。

java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`blogapp2`.`post_comments`, CONSTRAINT `FKrvgf8o4dg5kamt01me5gjqodf` FOREIGN KEY (`comments_id`) REFERENCES `comment` (`id`))
  @GetMapping("/dashboard/showposts/deletecomment/{id}")
    public String deleteComment(@PathVariable("id") Long id) {
        commentService.deleteComment(id);
        return "redirect:/admin/dashboard/showposts";
    }
 @OneToMany(cascade = CascadeType.ALL)
    private List<Comment> comments = new ArrayList<>();

L.E:我修改了我的处理程序方法,看起来像这样

 @GetMapping("/dashboard/showposts/deletecomment/{id}")
    public String deleteComment(@PathVariable("id") Long id) {
        List<Comment> comments = commentService.findAll();
        Comment comment = commentService.findBYId(id);
        comments.remove(comment);
        return "redirect:/admin/dashboard/showposts";
    }

共有1个答案

通煜祺
2023-03-14

你可以在不创建双向关系的情况下这样做,但在这样做时有一个警告,我稍后会讲到这一点,让我们看看如何在单向关系中做到这一点。

首先,您需要在实体关系上指定orphanremoval=true

@OneToMany(cascade = { CascadeType.ALL }, orphanRemoval = true)
List<Comment> comments = new ArrayList();

// Now I am assuming you have equals and hash code methods are implemented in your comment class,

// So all you need to load the Comment Entity by its id and then have to call

Comment comment = dao.findById(id);
comments.remove(comment);

// This will delete the comment from table and will keep all comments as it is.

// Another way is to iterate the comments list and find matching Comment object (add the method in transaction)

@Service
class PostService {

    @Transactional
    public Comment deleteComment(Integer commentId) {
       Post post = repository.findById(id);
       List<Comment> comments = post.getComments();
       Comment comment = comments.stream().filter(c -> c.getId().equals(commentId)).findAny()
     .orElseThrow(() -> new IllegalArgumentException("Invalid comment id"));
      
      comments.remove(comment);

      return comment;
    }

}

 

注意事项:

1. post.getComments() // will load all comments from database
2. comments.remove(comment) // will trigger additional INSERT statements

然后它将从注释表中删除该条目,因此这是使用单向关系必须付出的性能代价。

 类似资料:
  • 我在一个实体上有一个简单的单向ManyToOne关系,不幸的是,这个关系是在一个我无法更改的模式中定义的。

  • 我有以下作者类: 我的问题是这个测试用例中的最后一个断言失败了。如果我向作者添加一本书,它就会自动添加到图书存储库中。但是如果我从存储库中移除一本书,我如何从作者那里移除它呢?

  • 我有一个OneTo多项关系,我可以插入记录,但不能删除它们,当我试图删除它时,它会遇到“外键约束失败”错误。我使用级联删除孤儿如下,但不工作还。 父类的成员具有以下getter 成员类的父类具有以下getter 我也使用了下面的注释,但不起作用 我的冬眠依赖如下 我删除信息的代码

  • EventLicensetype.hbm.xml文件: 下面是EventInfo类。同样,在实际文件中有更多的字段,这只是重要的部分: 下面是EventLicenseType类 为什么它不能直接删除记录?为什么它要更新??我还尝试将代码更改为下面的代码,并得到相同的错误。 谁能帮我解决我缺少的东西,或者给我指明正确的方向?

  • 问题内容: 我使用Gson 库将Java对象转换为Json响应…问题是,在JPA请求之后,由于与其他实体的递归关系,无法转换从DB检索到的对象: 我的源代码: 如您在这里看到的,我做了: 只是通过为coordonneesList中的每个GPS对象设置null来消除递归关系。 您认为这是一个很好的解决方案,或者还有其他更实用的方法吗?谢谢 问题答案: 有一个名为GraphAdapterBuilder

  • 我有一个非常简单的Spring靴测试 我要从父实体中删除子实体。链接使用的是单向,拥有实体是父实体。我试着给1打电话。,但hibernate最终生成了一个update语句,将parent_name设置为null(而不是delete where parent_name=“father”),这违反了子表中的不可为null约束。 然后我试着打电话给2。,这一次它给出了一个异常。 你如何修复上面的,以使儿