public interface UserDAO {
public Set
<Answer
> findAnswers
(Integer userId
); }
@Transactional
public class UserHibernateDAO implements UserDAO {
@Override
public Set
<Answer
> findAnswers
(Integer userId
){ User user = getById(userId);
return user.getAnswers();
}
}
@Transactional
public class QuestionServiceImpl implements QuestionService {
@Override
public Question addAnswer
(Answer answer,
Integer questionId,
Integer userId
) { Question question = questionDAO.getById(questionId);
if(!hasUserAnsweredTheQuestion(questionId, userId)){
User user = userDAO.getById(userId);
Set<Answer> userAnswers = user.getAnswers();
addAnswerToCollection(answer, userAnswers);
user.setAnswers(userAnswers);
userDAO.save(user);
Set<Answer> answers = question.getAnswers();
answers = addAnswerToCollection(answer, answers);
question.setAnswers(answers);
questionDAO.update(question);
}
return question;
}
@Override
Question question = questionDAO.getById(questionId);
Set<Answer> answers = question.getAnswers();
Set<Answer> userAnswers = userDAO.findAnswers(userId);
if(!userAnswers.isEmpty()){
userAnswers.retainAll(answers);
return userAnswers.size() > 0;
}
return false;
}
}
Per tal que Set.retailAll
trobi les preguntes contingudes als sets answers
i userAnswers
s’ha d’especificar què vol dir aquesta igualtat. En el cas de Answers
, dues preguntes seran igual si tenen el mateix valor que answerId
.
@Table(name = "answers")
@Override
public boolean equals
(Object o
) { if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Answer answer = (Answer) o;
return !(getAnswerId() != null ? !getAnswerId().equals(answer.getAnswerId()) : answer.getAnswerId() != null);
}
@Override
public int hashCode() {
return getText() != null ? getText().hashCode() : 0;
}
}