【问题标题】:Making a tree of comments with Play Framework 2.3.8 with ebean ORM and java使用带有 ebean ORM 和 java 的 Play Framework 2.3.8 制作评论树
【发布时间】:2015-02-23 10:36:52
【问题描述】:

我正在通过边做边学的方式学习 Play Framework。我正在尝试制作一个简单的博客(使用来自官方网站的信息)并且卡住了。

我正在尝试制作一个帖子的 cmets 树。 到目前为止,我设计的模型类如下:

Post 类:

@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();
}

}

评论类:

@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());
}

}

我知道我必须使用一对多关系来完成任务(并且在模型类中我认为我做对了),但我被困在逻辑的实现中控制器来管理 cmets 和 cmets 的 cmets。任何线索或建议都会很棒。

附注我正在使用 MySql 数据库

【问题讨论】:

    标签: java mysql playframework ebean


    【解决方案1】:

    要创建评论,您可以这样做。

    在控制器中传递帖子 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
    

    类似地从视图中保存子 cmets 传递 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() 来获取实体对象

    【讨论】:

      【解决方案2】:

      实际上,您不需要为孩子使用两个类 - 这样您就必须有可能只有两个级别的评论,而只需将字段添加到您的 Comment 模型:

      @ManyToOne
      public Comment parent;
      
      @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="parent")
      public List<Comment> children;
      

      这样你理论上可以拥有无​​限的树枝。

      在创建新评论期间,您可以添加父评论的 ID - 如果它为空,则表示评论位于 根级别(没有父评论)

      【讨论】:

      • 这很优雅。谢谢你,先生。现在我必须弄清楚如何在控制器中执行逻辑。我对 Java 和 Play 框架真的很陌生。我来自 .NET 初级 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多