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

Java 微服务体系结构中的Hibernate连接表,java,sql,hibernate,microservices,hibernate-mapping,Java,Sql,Hibernate,Microservices,Hibernate Mapping,我有两个微服务,一个是用户服务,另一个是产品服务,都有自己的数据库 产品服务数据库表 user_products (id, user_id, product_id) products (id, name) User(id, name, ..) 用户与产品之间存在多对多关系。因为用户_产品是联接表,它只存在于产品服务中。我不确定如何为产品服务表创建hibernate模型对象,以便获得: 属于特定用户的所有产品列表 产品所有人名单 不知道如何用上面两个表定义@ManyToMany关系分析您的问题,

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

产品服务数据库表

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

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

  • 不知道如何用上面两个表定义@ManyToMany关系

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

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

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

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

  • 计划
  • 雇员
  • 如图所示,我们无法在项目实体中直接引用员工实体

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

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

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

    下面的博客很好地解释了其他用例和其他解决方案,这些解决方案描述了如何使用有限的上下文来处理低耦合和促进内聚。
    分析您的问题,您不认为产品和所有者不能有多对多的关系吗。 一个产品怎么可能由两个不同的所有者(用户)拥有? 通常,电子商务系统中的产品ID标识一个唯一的物理实体。即使有1个以上的类似产品(这是一个实际的生产场景),每个产品都有不同的产品ID

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

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

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

  • 计划
  • 雇员
  • 如图所示,我们无法在项目实体中直接引用员工实体

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

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

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

    下面的博客很好地解释了其他用例和其他解决方案,这些解决方案描述了如何使用有限的上下文来处理低耦合和促进内聚。

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

  • 用户可以拥有许多产品
  • 产品可以有很多用户
  • 为了保持我们的域之间的分离,我们需要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)发布到主题或队列或任何异步内容