16

我想创建两个表,一个带有评论,另一个带有回复,它们之间具有一对多的关系。但是如果他们也可以回复回复怎么办,那该怎么改变呢?这是我为一对多所拥有的,但我不知道如果也可以回复回复,它应该是什么样子。

    Comments:
•   Id
•   Title
•   Text

    Replies:
•   Id
•   Title
•   Text
•   Comment id

提前致谢。

4

2 回答 2

25

您可以只使用一个包含 ParentID 字段的表。如果记录没有值,则为评论,否则为回复(对评论或回复)。

您可以查询记录的 ParentID 记录(检查它的ParentID)以查看此回复是针对评论还是回复。

编辑:以上是一个相当实用的解决方案。但是,要使用规范化版本,仍然保留一个 Comments 表(没有 ParentID),并创建一个带有 CommentID 和 ResponseID 的 ReplyTo 表,这两个表都是 Comments 表中记录的 ID。

使用这个想法,下面的 sql 将显示评论和对每个评论的“回复”,每个回复都有评论:

select c.comment, r.comment as reply
from comment as c, comment as r, replyto as rt
where c.ID = rt.CommentID
and r.ID = rt.ReplyID

正如 Dimitrii 指出的那样,它不会显示没有回复的评论 - 为此你需要一个外部连接查询(没有测试语法):

SELECT c.comment, r.comment as reply,
from Comment c 
  left outer join Comment r on c.id = r.id  
  left outer join replyto rt on rt.responseid = r.id
于 2012-11-21T10:01:29.330 回答
0

我对评论和评论回复做了同样的事情。我创建了同一个表并添加了 parent_id 列并使用对象关联进行管理。

在此处输入图像描述

以下是评论实体:

公共类评论{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column(name = "message") 
private String message;

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "post_id")
private Post post;

@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST,
        CascadeType.REFRESH})
@JoinColumn(name ="user_id")
private User user;

@OneToMany(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST,
        CascadeType.REFRESH})
@JoinColumn(name="parent_id")
private List<Comment> replies;

public Comment(String message) {
    this.message = message;
}

public void addCommentReplies(Comment comment) {
    if(replies == null) {
        replies = new ArrayList<>();
    }
    replies.add(comment);
}

}


这是将现有评论引用添加为 parent_id 并添加新评论:

session.beginTransaction();
        
        int postId=1; // today is my birthday
        Post post = session.get(Post.class, postId);
        //add likes to the post
        
        Comment parentComment = session.get(Comment.class, 1);
        
        Comment replie1 = new Comment("First replied to comment - 1");
        
        Comment replie2 = new Comment("second replies to the comment - 2");
        
        
        
        int userId = 3;
        User user = session.get(User.class, userId);
        replie1.setUser(user);
        replie2.setUser(user);
        replie1.setPost(post);
        replie2.setPost(post);
        parentComment.addCommentReplies(replie1);
        parentComment.addCommentReplies(replie2);
        
        session.save(replie1);
        session.save(replie2);
        
        
        System.out.println("comment added successful..");
        
        
        session.getTransaction().commit();
于 2022-02-13T13:07:05.547 回答