我尝试制作一个迷你论坛,我被困住了 . 应该如何,首先,你创建一个帖子并写一个主题的消息,它重定向到所有帖子,并添加你创建的新发布,用户点击一个帖子,它在下一页显示所有填写的消息我也做了一个评论系统,我的每个帖子都有评论,所以问题出现在我的代码下面,当我试图让评论有效时,它的工作原理如下:无论你发布什么帖子都没关系选择它会显示所有存在的评论,所以我改变了并且失败了 . 可能有人解释我,如何正确使用Hibernate .

PostController是:注意方法seeMessage,它通过id找到帖子并显示消息 .

package com.pandora.controllers;

import com.pandora.domain.Post;
import com.pandora.services.CommentService;
import com.pandora.services.PostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/posts")
public class PostController {

    @Autowired
    private PostService postService;

    @Autowired
    private CommentService commentService;

    @RequestMapping
    public String findAll(Model model) {
        model.addAttribute("posts", postService.findAll());
        return "post/post";
    }

    @RequestMapping(value = "/click", method = RequestMethod.GET)
    public String click() {
        return "post/new";
    }

    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String addPost(@ModelAttribute Post post) {
        postService.addPost(post);
        return "redirect:/posts";
    }

    @RequestMapping(value = "/{title}/find", method = RequestMethod.GET)
    public String findByName(@PathVariable String title) {
        postService.findByTitle(title);
        return "redirect:/posts";
    }

    @RequestMapping(value = "/{id}/see", method = RequestMethod.GET)
    public String seeMessage(@PathVariable long id, Model model) {
        Post post = postService.findById(id);
        System.out.println("the id is " + id);
        System.out.println("the value of comments are " +post.getComments().size());

        model.addAttribute("post", post);
//        model.addAttribute("postMessage", post.getComments());

        return "post/postmessage";
    }

    @RequestMapping(value = "/{id}/delete")
    public String delete(@PathVariable long id) {
        postService.delete(id);
        return "redirect:/posts";
    }

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login(){
        return "login";
    }
}

CommentController是:这里注意方法addComment,首先我从它发布的id帖子中找到,之后我必须在创建的帖子中添加评论 .

package com.pandora.controllers;

import com.pandora.domain.Comment;

import com.pandora.domain.Post;
import com.pandora.services.CommentService;
import com.pandora.services.PostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.ArrayList;
import java.util.List;

@Controller
@RequestMapping("/comments")
public class CommentController {

    @Autowired
    private CommentService commentService;

    @Autowired
    private PostService postService;

    @RequestMapping(value = "/post/{postId}/comment", method = RequestMethod.POST)
    public String addComment(@PathVariable long postId, @ModelAttribute Comment comment){

        Post post = postService.findById(postId);

        System.out.println(post.getId());
        System.out.println(comment.getMessage());

        List<Comment> comments = new ArrayList<>();

        comments.add(commentService.addComment(comment));

        post.setComments(comments);

        return "redirect:/posts";
    }

    @RequestMapping(value = "/{id}/delete", method = RequestMethod.GET)
    public String delete(@PathVariable long id){
        commentService.delete(id);
        return "redirect:/posts";
    }    
}

邮政实体是:

package com.pandora.domain;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;
import java.util.List;

@Entity
@Setter
@Getter
@NoArgsConstructor
public class Post {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "post")
    private List<Comment> comments;

    @Column(length = 10000)
    private String message;

    private String title;
}

PostService是:

package com.pandora.services;

import com.pandora.domain.Post;
import com.pandora.domain.repositories.PostRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class PostService {

    @Autowired
    private PostRepository postRepository;

    public Post addPost(Post post){
        return postRepository.saveAndFlush(post);
    }

    public List<Post> findAll(){
        return postRepository.findAll();
    }

    public Post findByTitle(String title){
        return postRepository.findByTitle(title);
    }

    public Post findById(long id){
        return postRepository.findOne(id);
    }

    public void delete(long id){
        postRepository.delete(id);
    }
}

评论实体是:

package com.pandora.domain;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;

@Entity
@Setter
@Getter
@NoArgsConstructor
public class Comment {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @ManyToOne(fetch = FetchType.EAGER)
    private Post post;

    private String message;    
}

和CommentService是:

包com.pandora.services;

import com.pandora.domain.Comment;
import com.pandora.domain.repositories.CommentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CommentService {

    @Autowired
    private CommentRepository commentRepository;

    public Comment addComment(Comment comment){
        return commentRepository.saveAndFlush(comment);
    }

    public List<Comment> findAll(){
        return commentRepository.findAll();
    }

    public void delete(long id){
        commentRepository.delete(id);
    }

    public Comment findOne(long id){
        return commentRepository.findOne(id);
    }
}

和显示由它选择的帖子的HTML是:这里注意:每个div容器 . 我从一个从PostController评论中删除的列表中检索 . 但它不起作用,因为当我这样做时它总是空的 . 我不知道为什么它是空的 .

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      layout:decorator="layout">

<div layout:fragment="content">

    <h2 align="center">
        <h2 align="left">
            <div th:text="${post.title}"></div>
        </h2>
    </h2>

    <h4 align="center">
        <div th:text="${post.message}"></div>
    </h4>
    <hr/>
    <h4>Comments:</h4>
    
<h4> <div th:each="comments : ${post}"> <label for="username"><div th:inline="text">[[${#httpServletRequest.remoteUser}]]: </div> </label> <div th:each="comment : ${comments.comments}"> <div id="username" th:text="${comment}"></div> </div> </div> </h4>
<form method="post" name="comment_form" id="comment_form" th:action="@{'/comments/post/{id}/comment'(id=${post.id}) }" role="form"> <div class="form-group"> <label for="message">Comment</label> <textarea rows="5" class="form-control" id="message" name="message"/> </div> <button type="submit" id="submit" class="btn btn-primary">Submit</button> </form> </div> </html>