我正在学习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();
}
你能帮我找出这里有什么问题吗? 谢谢!
答案 0 :(得分:1)
这可能与您创建新User
对象的方式有关(未在代码中显示)。
除此之外,你可以尝试一些事情:
persist
方法merge
而非update
Set
代替List
来存储messages
equals
和hashCode
答案 1 :(得分:0)
我按如下方式修复问题:
<%
User user = (User)session.getAttribute("user");
Message message = new Message(request.getParameter("message"));
message.setOwner(user);
FactoryDAO.getInstance().getMessageDAO().update(message);
%>
我已将所有者设置为消息而不是向用户发送消息。 我仍然不明白为什么我的第一个版本没有像我预期的那样工作。