Spring + JPA( Hibernate) ORM
I try to make a mini forum and I'm stuck. How it should be, first of all, you create a post and write a message of a topic, it redirects to all post and adds new posted which you created, a user clicks on a post and it shows in next page all message which filled in. Also I made a comment system, I every post has to have comments, so the problem is in my code which is below, when I tried to make that comments work, it works like this: doesn't matter what post id you choose it shows all comments which do exist, so I changed and failed. May someone explains me, how to make correct with Hibernate.
PostController is: pay attention to method seeMessage, it finds the post by id and shows message.
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 is: And here pay attention on method addComment, first I find from what id post it went and after this I have to add comment to founded post.
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 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"; } }
Post entity is:
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 comments; @Column(length = 10000) private String message; private String title; }
PostService is:
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 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); } }
Comment entity is:
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; }
and CommentService is :
package 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 findAll(){ return commentRepository.findAll(); } public void delete(long id){ commentRepository.delete(id); } public Comment findOne(long id){ return commentRepository.findOne(id); } }
and HTML which shows post which chooses by it is: here pay attention to the: each div container. I retrieve from a list which is gone from PostController comments. But it doesn't work because when I do it it's always empty. I don't know why it's empty.
<!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>
<br/>
<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>
<br/>
<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>
链接地址: http://www.djcxy.com/p/8612.html
上一篇: 卷曲设置内容