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

时间:2017-11-12 22:02:15

标签: java hibernate spring-data spring-data-jpa

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

是否有Spring-data方法来实现这一目标?保存邮件后,我不想刷新整个userEntity。 (使用entitymanager.refresh())因为仅仅为了同步messageList而检索userEntity中的所有子对象似乎有点过分。

我可以将新邮件添加到userEntity,然后保存userEntity,但有时会向多个用户发送相同的邮件,我不想要检索所有用户对象只是为了能够保存一个消息。

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

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

谢谢。

2 个答案:

答案 0 :(得分:1)

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

所以我建议将域模型更改为具有自己的存储库的单独聚合根Message。存储库可能应该有一个方法来获取Message的所有User,也可能是另一个方法,用于获取在某个时间戳或不同{之后User发生的所有消息{1}}允许您只获取新的Message

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

答案 1 :(得分:0)

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