跳到主要内容

远程关联

警告

远程关联是Jimmer和微服务技术体系相结合后的产物,会在Spring Cloud和远程关联中详细介绍。

本文的目的并非系统性讲解远程关联,仅仅介绍远程关联所需映射配置。

@Entity

@Entity注解具备可选参数microServiceName,默认为""。

关联属性涉及两个实体类型,因为关联必然从源头方指向目标方 (自关联属性比较特殊,源头方和目标方重合)

  • 如果关联属性的源实体和目标实体的microServiceName相等,则该关联为本地关联 (本文之前所有例子中的实体都采用默认的microServiceName,因此都是本地关联)

  • 如果关联属性的源实体和目标实体的microServiceName不相等,则该关联为远程关联。

例如

  • 主动方 (必需): Book.authors

    Book.java
    @Entity(microServiceName = "book-service")
    public interface Book {

    @ManyToMany
    List<Author> authors();

    ...省略其他代码...
    }
  • 从动方 (可选): Author.authors

    Author.java
    @Entity(microServiceName = "author-service")
    public interface Author {

    @ManyToMany(mappedBy = "authors")
    List<Book> books();

    ...省略其他代码...
    }

这里,Book的微服务名为book-serviceAuthor的微服务名为author-service。二者不相等,因此Book.authorsAuthor.books都是远程关联

@MappedSuperclass

作为超类型的MappedSuperclass有两种用法

  • 可以包含关联属性,但必需隶属于同一个微服务

    BookServiceCommonEntity.java
    @MappedSuperclass(microServiceName = "book-service")
    public interface BookServiceCommonEntity {

    LocalDateTime createdTime();

    @ManyToOne
    User createdBy();

    LocalDateTime modifiedTime();

    @ManyToOne
    User modifiedBy();
    }

    这里BookServiceCommonEntity具备关联属性createdBymodifiedBy,但是只有同属于微服务"book-service"的Entity或其他MappedSuperclass才可以继承它。

  • 跨越任何微服务,但不得包含关联属性

    CommonEntity.java
    @MappedSuperclass(acrossMicroServices = true)
    public interface CommonEntity {

    LocalDateTime createdTime();

    LocalDateTime modifiedTime();
    }

    这里CommonEntity可以跨越任何微服务,任何微服务下的Entity或其他MappedSuperclass都可以继承它,但其本身不的包含任何关联属性。