Я изучаю 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();
}
Можете ли вы помочь мне выяснить, что здесь не так?
Спасибо!