4.1 问题描述
- 已知Topic的id,需要根据Topic的id获取特定Topic
- 获取这个Topic关联的所有的Reply
- 如果某个Reply有HostReply,需要查询出来
即:根据topicId查询出来的Topic对象要包含其所有Reply,同时每个Reply还要包含其HostReply信息
4.2 解决方案
我们应确保所有的DAO层的操作都是对数据库表的原子操作,对于对象的关联,我们应该在Service层完成。
所以,我们在HostReplyService中实现与UserBasic的对象关联(HostReply中包含作者信息),在ReplyService中实现与HostReplyService的对象关联(每个Reply可能包含有其HostReply),在TopicService中实现与Reply的关联(每个Topic有其对应的Reply列表)。
代码:
HostReplyServiceImpl:
package qqzone.service.impl;
import qqzone.dao.HostReplyDAO;
import qqzone.pojo.HostReply;
import qqzone.pojo.UserBasic;
import qqzone.service.HostReplyService;
import qqzone.service.UserBasicService;
public class HostReplyServiceImpl implements HostReplyService {
HostReplyDAO hostReplyDAO;
UserBasicService userBasicService;
@Override
public HostReply getHostReplyByReplyId(Integer replyId) {
HostReply hostReply = hostReplyDAO.getHostReplyByReplyId(replyId);
if(hostReply != null){
UserBasic author = userBasicService.getUserBasicById(hostReply.getAuthor().getId());
if (author != null){
hostReply.setAuthor(author);
}
}
return hostReply;
}
@Override
public HostReply getHostReplyById(Integer hostReplyId) {
HostReply hostReply = hostReplyDAO.getHostReplyById(hostReplyId);
if(hostReply != null){
UserBasic author = userBasicService.getUserBasicById(hostReply.getAuthor().getId());
if (author != null){
hostReply.setAuthor(author);
}
}
return hostReply;
}
@Override
public void delHostReply(Integer id) {
hostReplyDAO.delHostReply(id);
}
}
ReplyServiceImpl:
package qqzone.service.impl;
import qqzone.dao.ReplyDAO;
import qqzone.pojo.HostReply;
import qqzone.pojo.Reply;
import qqzone.pojo.UserBasic;
import qqzone.service.HostReplyService;
import qqzone.service.ReplyService;
import qqzone.service.UserBasicService;
import java.util.List;
public class ReplyServiceImpl implements ReplyService {
ReplyDAO replyDAO;
HostReplyService hostReplyService;
UserBasicService userBasicService;
@Override
public List<Reply> getReplyList(Integer topicId) {
List<Reply> replyList = replyDAO.getReplyList(topicId);
for (Reply reply : replyList) {
UserBasic author = userBasicService.getUserBasicById(reply.getAuthor().getId());
if (author != null){
reply.setAuthor(author);
}
HostReply hostReply = hostReplyService.getHostReplyByReplyId(reply.getId());
if(hostReply != null){
reply.setHostReply(hostReply);
}
}
return replyList;
}
@Override
public void addReply(Reply reply) {
replyDAO.add(reply);
}
@Override
public void delReply(Integer replyId) {
//在删除reply之前要删除其主人回复
HostReply hostReply = hostReplyService.getHostReplyByReplyId(replyId);
if(hostReply != null){
hostReplyService.delHostReply(hostReply.getId());
}
replyDAO.delete(replyId);
}
}
TopicServiceImpl:
package qqzone.service.impl;
import qqzone.dao.TopicDAO;
import qqzone.pojo.Reply;
import qqzone.pojo.Topic;
import qqzone.pojo.UserBasic;
import qqzone.service.ReplyService;
import qqzone.service.TopicService;
import qqzone.service.UserBasicService;
import java.util.List;
public class TopicServiceImpl implements TopicService {
TopicDAO topicDAO;
ReplyService replyService;
UserBasicService userBasicService;
@Override
public List<Topic> getTopicList(UserBasic userBasic) {
List<Topic> topicList = topicDAO.getTopicList(userBasic);
for (Topic topic : topicList) {
UserBasic author = userBasicService.getUserBasicById(topic.getAuthor().getId());
if(author != null){
topic.setAuthor(author);
}
List<Reply> replyList = replyService.getReplyList(topic.getId());
if(!replyList.isEmpty()){
topic.setReplyList(replyList);
}
}
return topicList;
}
@Override
public Topic getTopicById(Integer id) {
Topic topic = topicDAO.getTopic(id);
UserBasic author = userBasicService.getUserBasicById(topic.getAuthor().getId());
if(author != null){
topic.setAuthor(author);
}
List<Reply> replyList = replyService.getReplyList(topic.getId());
if(!replyList.isEmpty()){
topic.setReplyList(replyList);
}
return topic;
}
@Override
public void delTopic(Integer topicId) {
// 在删除文章之前删除所有回复
List<Reply> replyList = replyService.getReplyList(topicId);
if(!replyList.isEmpty()){
for (Reply reply : replyList) {
replyService.delReply(reply.getId());
}
}
topicDAO.delTopic(topicId);
}
}