@ManyToOne和@OneToMany解析&个人博客项目评论区取数据代码解析

@ManyToOne和@OneToMany解析&个人博客项目评论区取数据代码解析

写在前面:前些天面试的时候被细问到项目中的评论区取数据的方法,说了半天没说清楚,然后想想发现自己确实不太清楚,就去看了下项目的源代码,搞懂了逻辑,然后这里详细说下;顺带简单说下ManyToOne和OneToMany

注解部分

  • ManyToOne:-->说的是多对一,一般放在多的那个变量上面,例如学校对应学生,这个注解一般放在学生实体类中的学生变量上,这里的Many对应的student,One对应着School
  • OneToMany:-->说的是一对多,借用上面的例子就是学校对应学生
  • 这两个注解会自动关联表,然后将对应的结果映射到设置的对象内(所以结果和对象一定要对应的上)
  • 在个人博客项目场景里,取评论数据的时候用到了这两个注解,其中Many对应着父评论的所有子评论,One对应着所有父评论,ManyToOne对应着子评论,用列表存储;OneToMany对应着父评论,只要一个Comment对象即可;根据这两个变量就可以获取到评论区数据的一个顺序和分层关系(有很多第一个评论的,他们没有父评论,但是可能有子评论,然后子评论也可能有子评论,然后一个父评论见下面跟着的所有的子评论要做一个缩进(只做一次)

代码详细讲解(评论区数据如何取出)

写在前面:这里先展示下评论数据的表结构

  • 主要思路:使用到了上面提到的两个变量(两个变量都存在于每一个comment对象中),然后对每一个父节点做深搜,然后更新每个对象中的子评论列表(存储该父评论的所有子评论),然后只取没有父评论的对象即可(其中存储着它的所有子评论,它的父评论属性为null-->以此来判断)
  • 在项目中的整体逻辑:拉取对应博客所有评论-->合并/更新子评论列表(或者说补全)-->渲染到前端
    • 读取已有评论:
      • 这里是博客展示的时候需要读取和博客关联的所有评论,代码中会先行从数据库拉取博客相关的所有父评论为null的评论
      • 然后调用eachComment方法来遍历每一个评论,并进一步调用combineChildren方法来更新每个对象中的子评论集合
      • combineChildren方法中更新子评论集合的方法是使用一个递归方法,深搜的思想(通过临时变量存储)
      • 至此数据获取完毕,返回controller渲染到页面即可,前端thymleaf会解析数据填充上去
    • 新增评论(回复或者是在博客下面新增评论):这就很简单了,需要简单判断下,判断传过来的comment对象是否有父评论,并以此为依据来填充对象(页面传过来的对象是不完整的,只有关键信息,需要补全然后持久化),然后用仓库存储到MySQL中

以上
希望对大家有所帮助

posted @ 2022-09-14 21:38  醉生梦死_0423  阅读(216)  评论(0编辑  收藏  举报