在一对多关系中重复输入表格

时间:2011-11-19 21:23:09

标签: java hibernate jpa

我正在学习jpa并决定做一个用户可以发布消息的基本webapp,因此用户有很多消息。问题是,当我向User的消息集合添加消息时,我在Message表中获得了重复的条目。 (注意我有两个表,其中所有者ID为Message,没有连接表)。

这是对话:

第一条消息 - > 拉里说:你好约翰

第二条消息 - > 拉里说:你在吗?

第三条消息 - > John说:是的

第四条消息 - > 拉里说:好的

第五条消息 - > John说:很好

这就是我在屏幕上看到的内容:

拉里:你好约翰

拉里你好约翰

拉里:你在吗?

约翰:是的

拉里:你好约翰

拉里:你在吗?

拉里:好的

约翰:是的

约翰:很好

表格内容为:

+----+----------------+----------+
| 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 scriptlet部分:

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 个答案:

答案 0 :(得分:1)

这可能与您创建新User对象的方式有关(未在代码中显示)。

除此之外,你可以尝试一些事情:

  1. persist方法
  2. 中使用merge而非update
  3. 使用Set代替List来存储messages
  4. 请务必覆盖两个实体中的equalshashCode

答案 1 :(得分:0)

我按如下方式修复问题:

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

我已将所有者设置为消息而不是向用户发送消息。 我仍然不明白为什么我的第一个版本没有像我预期的那样工作。