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

Posted

技术标签:

【中文标题】不接收来自数据库的更新数据(Spring OneToMany 关系)【英文标题】:Doesn't receive updated data from the database (Spring OneToMany relationship) 【发布时间】:2021-04-18 18:14:34 【问题描述】:

我是 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),一切正常。但是在添加 Message 之后,此函数返回相同的 Set 而没有新的 Message。尽管出现了数据库中的条目并且如果调用:

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";
    

【问题讨论】:

请显示您如何添加消息的代码。 你在使用缓存吗 @AlexRudenko 将代码添加到主题 @Hamza 我认为没有 我怀疑问题出在 FETCHTYPE 上。还要添加有关如何添加消息以及两个实体之间关系的代码。 【参考方案1】:

您似乎将作者添加到消息中,但您没有为作者做同样的事情:

例如在 Author 类中添加一个新方法来添加新消息:

public class Author 
...
   public void addMessage(Message message)
        if(messages==null) messages= new HashSet();
        messages.add(message);
   
...

并像这样在您的代码中使用它:

author.addMessage(message);

请注意,您应该定义 hashCode 方法,否则 HashSet 将忽略新消息。

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

【讨论】:

以上是关于不接收来自数据库的更新数据(Spring OneToMany 关系)的主要内容,如果未能解决你的问题,请参考以下文章

Spring-batch - 比较来自 csv 的数据并相应地更新 Salesforce 中的记录

SwiftUI ObjectBinding 不会使用 combine 接收来自可绑定对象的 didchange 更新

Spring MVC - 如何使用 JSP 表更新数据库中的行?

同步 Spring ActiveMQ 接收器

如何在 Python 中通过 HTTP 提供来自 UDP 流的数据?

回声连接不接收来自广播状态通道的数据