Прежде всего, дизайн выглядит некорректно. Никогда не следует смешивать POJO с DAO. DAO - это классы «объектов доступа к данным», которые имеют дело с CRUD-операциями над POJO. Здесь у вас есть 2 POJO - Review и RegisteredUser. ReviewDAO несет ответственность за выполнение операций CRUD над управляемыми / неуправляемыми экземплярами (или объектами) Review. И для RegisteredUser вам, вероятно, понадобится еще один POJO (в вашем фактическом коде).
Во-вторых, я вижу, что вы вызываете метод List contains, чтобы проверить, дал ли пользователь этот отзыв, но вы еще не реализованы «равно» и «hashCode» в ReviewDAO .
public void addReview(ReviewDAO review) {
if (!this.reviews.contains(review)) {
this.reviews.add(review);
review.addRegisteredUser(this);
}
}
Я сделал несколько настроек. Пожалуйста, проверьте, удовлетворяет ли он вашу потребность:
RegisteredUser class (вы использовали хэш-набор, потому что поиск "содержит" будет быстрее)
public class RegisteredUser {
private String nickname;
private Set<Review> reviews;
public RegisteredUser(String nickname) {
this.nickname = nickname;
reviews = new HashSet<>();
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public void addReview(Review review) {
if (!this.reviews.contains(review)) {
this.reviews.add(review);
//review.addRegisteredUser(this);
}
}
@Override
public String toString() {
return "RegisteredUser{" +
"nickname='" + nickname + '\'' +
", reviews=" + reviews +
'}';
}
}
ReviewDAO class :
public abstract class ReviewDAO {
private RegisteredUser registeredUser;
public abstract boolean write(Review review);
public void addRegisteredUser(RegisteredUser registeredUser) {
this.registeredUser = registeredUser;
}
}
Класс проверки :
public class Review {
private String title;
private String description;
private int rank;
private boolean isAnonymous;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public boolean isAnonymous() {
return isAnonymous;
}
public void setAnonymous(boolean anonymous) {
isAnonymous = anonymous;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Review review = (Review) o;
return Objects.equals(title, review.title);
}
@Override
public int hashCode() {
return Objects.hash(title);
}
}
BusinessLogi c класс
public class BusinessLogic {
public static void main(String[] args) throws ExecutionControl.NotImplementedException {
ReviewDAO_Factory reviewDAO_factory = new ReviewDAO_Factory();
RegisteredUser registeredUser = new RegisteredUser("Alessandro");
Review review = new Review();
review.setTitle("some review");
review.setDescription("some desc");
registeredUser.addReview(review);
ReviewDAO reviewDAO = reviewDAO_factory.getReviewDAO("mongodb");
reviewDAO.addRegisteredUser(registeredUser);
System.out.println(registeredUser.toString());
}
}