[英]Making a tree of comments with Play Framework 2.3.8 with ebean ORM and java
我正在通过边做边学的方法来学习Play框架。 我正在尝试制作一个简单的博客(使用官方网站上的信息)并陷入困境。
我正在尝试对帖子发表评论。 到目前为止,我将模型类设计如下:
邮政课:
@Entity
public class Post extends Model {
@Id
public Long id;
public String title;
public Date postedAt;
@Column(columnDefinition = "TEXT")
public String content;
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="post")
public List<Comment> comments;
public static Finder<Long, Post> find = new Finder(Long.class, Post.class);
public static List<Post> all() {
return find.all();
}
public static void create(Post post) {
post.save();
}
public static void delete(Long id) {
find.ref(id).delete();
}
}
Comment类:
@Entity
public class Comment extends Model {
@Id
public Long id;
public String content;
public static Finder<Long, Comment> find = new Finder(Long.class, Comment.class);
public static List<Comment> all() {
return find.all();
}
public static void create(Comment comment) {
comment.save();
}
public static void delete(Long id) {
find.ref(id).delete();
}
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="post")
public List<ChildComment> childComments;
@ManyToOne
public Post post;
}
ChildComment类:
public class ChildComment extends Model{
@Id
public Long id;
public String content;
@ManyToOne
public Comment comment;
}
控制器类Application.java
public class Application extends Controller {
public static Form<Post> postForm = Form.form(Post.class);
public static Result posts() {
return ok(views.html.index.render(Post.all(), postForm));
}
public static Result index() {
return redirect(routes.Application.posts());
}
public static Result newPost() {
Form<Post> filledForm = postForm.bindFromRequest();
if (filledForm.hasErrors()) {
return badRequest(views.html.index.render(Post.all(), filledForm));
} else {
Post.create(filledForm.get());
return redirect(routes.Application.posts());
}
}
public static Result deletePost(Long id) {
Post.delete(id);
return redirect(routes.Application.posts());
}
}
我知道我必须使用一对多关系来完成任务(在模型类中,我认为我做对了),但是我陷入了控制器中逻辑的实现,无法管理注释和注释。评论。 任何线索或建议都会很棒。
PS我正在使用MySql数据库
要创建评论,您可以执行。
在控制器中传递帖子ID和评论数据
然后在控制器中
//post_id and commentData received from view
Post post=Post.findByPostId(post_id); //find post of that comment where findByPostId() is a function in model
Comment comment=new Comment(commentData,null,post); //Create a new Comment Object
Comment cm=Comment.save(comment); //where save() saves the Comment object in data base and return the saved object
List <Comments> allCommentsOnPost=post.getComments(); //get all comments on that post
allComments.add(cm); //add new comment to list
post.setComments(allCommentsOnPost); //set the new list in Post object
post.update(post_id); //update post entity
同样,要保存子评论,请从视图中传递comment_id,childCommentData
//comment_id and childCommentData received from view
Comment cm=Comment.findByCommentId(comment_id); //find comment from id ,findByCommentId() defined in Comment entity
ChildComment childCom=new ChildComment(childCommentData,cm); //create new object of ChildComment
ChildComment childComment=ChildComment.save(childCom); //persist the child comment object in db ,save() is a function in model which saves ChildComment object and return it
List<ChildComments> allChildComments=cm.getChildComments(); //getting list of all the ChildComments .
allChildComments.add(childComment); //add new comment to list
cm.setChildComments(allChildComments); //set all the child comments in Comment Entity
cm.update(comment_id); //update the Comments entity in db
注意:我分别在两种情况下都创建了新的Comment和ChildComment对象,您也可以使用bindRequest()。get()获取Entity对象
实际上,您不需要为孩子使用两个类-这样,您仅需要两个注释级别,而只需将字段添加到Comment
模型即可:
@ManyToOne
public Comment parent;
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="parent")
public List<Comment> children;
这样,您理论上就可以拥有无限的树枝。
在创建新评论期间,您可以添加父评论的ID-如果为空,则表示该评论位于根级别 (无父)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.