Hibernate加入微服务架构table

Hibernate Join table in microservice architecture

我有两个微服务,一个是用户服务,一个是产品服务,都有自己的数据库

产品服务数据库 tables

user_products (id, user_id, product_id)
products (id, name)

用户服务数据库tables

User(id, name, ..)

用户和产品具有多对多关系。由于 user_products 是 join table,它仅存在于产品服务中。我不确定如何为产品服务 table 创建休眠模型对象,以便我可以获得:

  1. 属于特定用户的所有产品列表
  2. 产品的所有所有者列表

不确定如何定义与以上两个 tables

的 @ManyToMany 关系

分析你的问题,你是不是觉得Product和Owner不能多对多的关系。 一个产品怎么可能由两个不同的所有者(用户)拥有? 通常,电子商务系统中的产品ID标识1个唯一的物理实体。即使有超过 1 个类似产品(这是实际生产场景)IMO 每个产品都会有不同的产品 ID。

但是,让我们考虑一些不同的情况,其中两个实体相互依赖。在这里出现的概念是bounded context.

每个服务都应该拥有自己的数据,并应对其完整性和可变性负责。每个服务都应该独立存在,即能够更改和移入和移出运行时环境,而不会对其他服务产生副作用。

让我们举一个更清楚的例子,公司需要在他们的员工中管理项目。我们可以在这里看到两种不同的上下文(现在忽略所有其他公司相关的处理)

  1. 项目
  2. 员工

如图所示,我们不能直接引用 Project 实体中的 Employee 实体。

优雅的解决方案是:假设对象模型映射到关系数据源,而不是项目服务必须映射员工类型,它只需要映射 员工 ID属性。

Project_Resource 模型的底层映射 table 不会具体化数据库中的 Employee 对象。为了获取或改变员工,您将利用员工上下文中的员工服务 API 调用。

因此,必须引入更多机制来支持这种隔离。具体来说,当通过员工服务删除员工时,其他服务是如何知道这次删除的? Employee服务同步调用Product服务会导致高耦合。在这种情况下应该使用异步模式来解耦其他服务(更多的是发布事件,另一个服务可以决定他们是否必须采取行动)

以下博客很好地解释了其他用例和其他解决方案,描述了使用限界上下文来处理低耦合和促进内聚。 https://hackernoon.com/microservices-bounded-context-cohesion-what-do-they-have-in-common-1107b70342b3

@ManyToMany 在概念上只是两个@OneToMany - 从两个域的角度来看:

  1. 用户可以拥有多个产品
  2. 产品可以有很多用户。

为了保持域之间的分离,我们需要 4 个 table,而不是通常的整体式 3 个,每个域 2 个:

user (user_id, name, ...)
user_product (user_id, product_d)
product (product_id, name, ...)
product_user (product_id, user_id)

假设我们在用户域中,我们希望向其中添加几个已由 product_id 识别的现有产品。您的用户服务只需将记录添加到 user_products table,并针对每条记录将事件(包括 product_id 和 user_id)发布到主题或队列或任何异步方法可用。产品服务中的侦听器拾取这些事件,并从每个事件中将记录插入 product_user table。当然,您也可以发布删除事件,以便在您想要从用户中删除产品时使用。

你在另一个方向上做完全相同的事情,但从用户的角度来看。现在您可以获得分配给任何 user_id 的所有产品对象,以及分配给任何 product_id.

的所有用户对象

从物理上讲,您通过将信息放在两个域中来复制有关多对多连接 table 的信息。这需要做更多的工作,因为您需要使用事件发布来保持同步,但不幸的是,您无法免费获得隔离。