有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

微服务体系结构中的java Hibernate连接表

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

产品服务数据库表

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

用户服务数据库表

User(id, name, ..)

用户与产品之间存在多对多关系。因为用户_产品是联接表,它只存在于产品服务中。我不确定如何为产品服务表创建hibernate模型对象,以便获得:

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

不知道如何定义@ManyToMany与上述两个表的关系


共 (2) 个答案

  1. # 1 楼答案

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

    但是,让我们考虑两个实体相互依赖的不同情况。在这里,图片中出现的概念是有界上下文

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

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

    1. 计划
    2. 雇员

    如图所示,我们不能在项目实体中直接引用员工实体

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

    enter image description here

    Project_资源模型的基础映射表不会从数据库中具体化Employee对象。为了获取或修改员工,您将使用来自员工上下文的员工服务API调用

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

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

  2. # 2 楼答案

    从概念上讲,一个@manytomy只是两个@OneToMany,从两个领域的角度来看各有一个:

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

    为了保持我们的域之间的分离,我们需要4个表,而不是通常的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表中,并为每个记录将事件(包括product_id和user_id)发布到主题或队列或任何可用的异步方法中。产品服务中的侦听器会拾取这些事件,并从中向product_用户表中插入记录。当然,当您想从用户删除产品时,也可以发布删除事件

    你在另一个方向上做同样的事情,只是从用户的角度出发。现在,您可以获得分配给任何用户id的所有产品对象,以及分配给任何产品id的所有用户对象

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