我想创建简单的网络应用程序,其中包含主题和评论。 主题模型:
@Entity
@Table(name = "T_TOPIC")
public class Topic {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@ManyToOne
@JoinColumn(name="USER_ID")
private User author;
@Enumerated(EnumType.STRING)
private Tag topicTag;
private String name;
private String text;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "topic", cascade = CascadeType.ALL)
private List<Comment> comments;
// We shouldn't read whole collection to get this basic info
private int commentsCount;
private Date timeLastUpdated;
/**
* Removes comment from the Topic entity
* @param comment
*/
public void removeComment(Comment comment) {
// updating topic
timeLastUpdated = Utils.getCurrentTime();
commentsCount--;
comments.remove(comment);
}
}
评论模型:
@Entity
@Table(name = "T_COMMENT")
public class Comment
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@ManyToOne
@JoinColumn(name="TOPIC_ID")
private Topic topic;
@ManyToOne
@JoinColumn(name="USER_ID")
private User author;
private String text;
private Date creationDate;
}
评论服务:
@Service
@Transactional
public class CommentService {
@Autowired
private CommentRepository commentRepository;
public int saveComment(Comment comment){
return commentRepository.save(comment).getId();
}
public Comment findCommentByID(int id){
return commentRepository.findOne(id);
}
/**
* Deletes a comment
* @param comment -- a comment to delete
* @return id of a topic
*/
public int deleteComment(Comment comment) {
int result = comment.getTopic().getId();
commentRepository.delete(comment);
return result;
}
}
控制器的方法,即删除注释:
@RequestMapping(value = "/deleteComment/{commentId}", method = {RequestMethod.POST, RequestMethod.GET} )
public String deleteComment(@PathVariable int commentId, @ModelAttribute("comment")Comment comment, BindingResult result, Model model){
Topic parentTopic;
Comment deletedComment = commentService.findCommentByID(commentId);
if (deletedComment != null) {
// remove any relations
parentTopic = deletedComment.getTopic();
parentTopic.removeComment(deletedComment);
// rempve the comment itself
commentService.deleteComment(deletedComment);
}
//return "refresh:";
return "home";
}
删除的实体传递给persist:[com.epam.mvc3.model.Comment#]
答案 0 :(得分:0)
如果您从存储库中删除它,则不必自己从Topic中的集合中删除Comment对象,并且我认为这样做会导致您的合并删除注释,并且删除以尝试删除并已删除评论。
尝试更改它以从主题中删除评论,然后保存主题。或者在运行查询的服务中创建一个方法,以计算给定主题的注释数量,而无需读取整个集合。
虽然评论提取类型非常渴望,但为什么不使用comments.size()
?
答案 1 :(得分:0)
按如下所示更改您的deleteComment(),
public int deleteComment(int commentId)
{
Comment existingComment = findCommentByID(commentId);
if(existingComment != null)
{
int result = existingComment .getTopic().getId();
Topic existingTopic = existingComment .getTopic();
existingTopic.remove(existingComment)
topicRepository.save(existingTopic);// spring 3.1
topicRepository.merge(existingTopic);// spring 3.0
return result;
}
return 0;
}
这里的要点是我们需要始终使用父dao / repository来处理子进程。
因此,首先从主题中删除注释,然后使用topicRepository保存/合并主题。