Получение повторяющихся записей в таблице для отношения один ко многим - PullRequest
3 голосов
/ 20 ноября 2011

Я изучаю jpa и решил создать простое веб-приложение, в котором пользователь может публиковать сообщения, поэтому у пользователя много сообщений. Проблема в том, что когда я добавляю сообщение в коллекцию сообщений пользователя, я получаю дублированные записи в таблице сообщений. (обратите внимание, у меня есть две таблицы с идентификатором владельца в сообщении, нет таблицы соединения).

Это разговор:

Первое сообщение -> Ларри говорит: Привет, Джон

Второе сообщение -> Ларри говорит: Вы здесь?

Третье сообщение -> Джон говорит: Да

Четвертое сообщение -> Ларри говорит: хорошо

Пятое сообщение -> Джон говорит: хорошо

Вот что я получаю на экране:

Ларри: Привет, Джон

Ларри, Привет, Джон

Ларри: Ты там?

Джон: Да

Ларри: Привет, Джон

Ларри: Ты там?

Ларри: хорошо

Джон: Да

Джон: отлично

Содержание таблицы:

+----+----------------+----------+
| id | message        | owner_id |
+----+----------------+----------+
|  1 | Hello John     |     NULL | <- Why the NULL fields?
|  2 | Hello John     |     NULL |
|  3 | Are you there? |     NULL |
|  4 | Yep            |     NULL |
|  5 | Hello John     |        1 |
|  6 | Are you there? |        1 |
|  7 | ok             |        1 |
|  8 | Yep            |        2 |
|  9 | fine           |        2 |
+----+----------------+----------+

Это мои классы и их сопоставления.

@Entity

public class User implements Serializable {

    @Id
    @GeneratedValue
    private Long id;
    private String username;
    private String password;

    @OneToMany (fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name="owner_id")
    private List<Message> messages; ...and all of its corresponding getters and setters

@Entity
public class Message implements Serializable {

    @Id
    @GeneratedValue
    private Long id;
    private String message;

    @ManyToOne
    private User owner; //...and all of its corresponding getters and setters

Это соответствующий раздел скрипта jsp, который сохраняет пользователя:

User user = (User)session.getAttribute("user");
user.getMessages().add(new Message(request.getParameter("message")));

FactoryDAO.getInstance().getUserDAO().update(user);

метод обновления (пользователь):

public void update(User user) {
    initEntityManager(); <- method in the superclass which initializes the entityManager
    tx.begin();
    entityManager.merge(user);
    entityManager.flush();
    tx.commit();
    closeEntityManager();
}

Можете ли вы помочь мне выяснить, что здесь не так? Спасибо!

Ответы [ 2 ]

1 голос
/ 20 ноября 2011

Это может быть связано с тем, как вы создаете новые User объекты (не показанные в вашем коде).

Кроме этого, пара вещей, которые вы можете попробовать:

  1. Используйте persist, а не merge в методе update
  2. Используйте Set вместо List для хранения messages
  3. Обязательно переопределите equals и hashCode в обеих ваших сущностях
0 голосов
/ 30 ноября 2011

Я исправляю проблему следующим образом:

<%
  User user = (User)session.getAttribute("user");
  Message message = new Message(request.getParameter("message"));
  message.setOwner(user);
  FactoryDAO.getInstance().getMessageDAO().update(message);
%>

Я установил владельцем сообщение вместо сообщения пользователю.Я до сих пор не понимаю, почему моя первая версия не работала так, как я ожидал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...