我想创建两个表,一个带有评论,另一个带有回复,它们之间具有一对多的关系。但是如果他们也可以回复回复怎么办,那该怎么改变呢?这是我为一对多所拥有的,但我不知道如果也可以回复回复,它应该是什么样子。
Comments:
• Id
• Title
• Text
Replies:
• Id
• Title
• Text
• Comment id
提前致谢。
我想创建两个表,一个带有评论,另一个带有回复,它们之间具有一对多的关系。但是如果他们也可以回复回复怎么办,那该怎么改变呢?这是我为一对多所拥有的,但我不知道如果也可以回复回复,它应该是什么样子。
Comments:
• Id
• Title
• Text
Replies:
• Id
• Title
• Text
• Comment id
提前致谢。
您可以只使用一个包含 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
我对评论和评论回复做了同样的事情。我创建了同一个表并添加了 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();