问题描述
我是 Java 新手,现在我正在编写一个简单的学习网站。我遇到了这个问题:
用户实体:
@OneToMany(mappedBy = "author",cascade = CascadeType.ALL,fetch = FetchType.LAZY)
private Set<Message> messages;
消息实体:
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private User author;
控制器:
Set<Message> messages = user.getMessages();
model.addAttribute("messages",messages);
当我第一次获取数据时(使用 getMessages),一切正常。但是在添加消息后,此函数返回相同的 Set 而没有新消息。尽管出现了数据库中的条目并且如果被调用:
messages = messageRepo.findAll();
新消息出现在列表中。重新启动服务器后,getMessages 方法中会出现一篇新文章。 我的错,为什么添加新消息后数据没有更新?
更新:
添加消息的代码:
@PostMapping("/main")
public String add(
@AuthenticationPrincipal User user,@Valid Message message,BindingResult bindingResult,Model model
) throws IOException {
message.setAuthor(user);
if (bindingResult.hasErrors()) {
Map<String,String> errorsMap = ControllerUtils.getErrors(bindingResult);
model.mergeAttributes(errorsMap);
model.addAttribute("message",message);
} else {
model.addAttribute("message",null);
messageRepo.save(message);
}
return "main";
}
解决方法
您似乎将作者添加到消息中,但您没有为作者做同样的事情:
例如在 Author 类中添加一个新方法来添加新消息:
public class Author {
...
public void addMessage(Message message){
if(messages==null) messages= new HashSet();
messages.add(message);
}
...
}
并在您的代码中像这样使用它:
author.addMessage(message);
请注意,您应该定义 hashCode 方法,否则 HashSet 将忽略新消息。
此外,如果您对使用双向关系没有任何限制,最好仅使用单向关系(消息 -> 作者)。