将子对象保存到数据库后,如何同步实体



我有一个User对象,它在用户登录期间从数据库加载。此用户与Message实体具有OneToMany关系(messageList)。当另一个用户向该用户发送新消息时,该消息将存储在数据库中。之后,我需要将登录用户的messageList自动与数据库同步。换句话说,新消息需要出现在接收用户的messageList列表中。

有没有Spring数据的方法可以实现这一点?我不希望在保存消息后刷新整个userEntity。(使用entitymanager.refresh()),因为仅仅为了同步messageList而检索userEntity中的所有子对象似乎有些过头了。

我可以将新消息添加到userEntity中,然后保存userEntity,但有时同一条消息会发送给多个用户,我不想为了保存消息而检索所有用户对象。

我目前的解决方案是制作一个SpringAspectJ侦听器方法,该方法侦听保存消息的所有方法。当这种情况发生时,保存消息将被手动添加到相关的用户实体messageList中。你可能会问为什么要这么努力?因为我希望消息自动出现在前端(我使用的是Angular 4框架)。Angular 4监听数据模型中的更改。

但在实现此解决方案之前,我想知道是否有更简单的方法来实现消息列表同步。

谢谢。

我认为主要问题是您认为MessageUser的一部分。根据您的描述,User似乎或多或少由静态信息组成,而Message经常出现。

因此,我建议更改域模型,将Message作为一个单独的聚合根,并拥有自己的存储库。存储库可能应该有一个方法来获取User的所有Messages,也可能有另一个方法用于获取某个时间戳或不同的Message之后User发生的所有消息,从而只获取新的Messages。

另一个问题是,如果你在工作中使用了正确的技术。通过关系数据库分发事件是可能的,但它们并不是为此而构建的。您可能需要考虑其他选择,如内存存储(例如Hazelcast)或专用消息传递解决方案(例如RabbitMQ)。请注意,Message仍然可以(也可能应该)保存在持久存储中,但不能使用该存储进行分发

我将不得不使用websocket来实现我想要的。由于我在项目中使用了Spring,因此我将使用Spring websocket模块。

最新更新