不接收来自数据库的更新数据Spring OneToMany 关系

问题描述

我是 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 将忽略新消息。

此外,如果您对使用双向关系没有任何限制,最好仅使用单向关系(消息 -> 作者)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...