首页 > 解决方案 > 使用 Spring Boot 和 Hibernate 在 2 个微服务中建立多对多关系的问题

问题描述

所以对于这个任务,我应该有 2 个微服务(任务服务和用户服务),每个都有自己的数据库。一个任务可以分配给多个用户,但可以将多个用户分配给多个任务,因此它是多对多的关系。

这两个微服务都是使用 Hibernate 的 Spring Boot 应用程序,我正在努力使任务服务中的任务和用户之间发生这种关系,因为我认为复制用户服务中已经存在的用户模型不是一个好主意,交给任务服务。

此分配假设两个数据库中的用户 ID 保持一致,而无需使用外键。

对于上下文:

从 Hibernate 生成的所需实体关系图:ERD

Task.java [任务服务]

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
public class Task extends BaseEntity {

    private String name, description;

    @ManyToOne
    private Lane lane;

    @OneToMany
    private List<TaskUser> users;
}

TaskUser.java [任务服务]

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@EqualsAndHashCode
public class TaskUser {

    @Id
    private Long id;

    @Column(name = "task_id")
    private Long taskId;

    @Column(name = "user_id")
    private Long userId;
 }

User.java [用户服务]

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class User extends BaseEntity {
    @Column(unique = true)
    private String username;
}

目前,Hibernate 正在任务服务数据库中生成一个 task_user 和 task_users 表,我希望只有一个中间表而不是两个。

问题:在使用两个不同的微服务时,如何使这种多对多关系与 Hibernate 一起工作?

标签: javaspringspring-boothibernatejpa

解决方案


也许更好的休眠映射:

Task.java [任务服务]

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
public class Task extends BaseEntity {

    private String name, description;

    @ManyToOne
    private Lane lane;

    @OneToMany(mappedBy="task")
    private List<TaskUser> users;
}

TaskUser.java [任务服务]

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@EqualsAndHashCode
public class TaskUser {

    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name="task_id", nullable=false)
    private Task task;

    @Column(name = "user_id")
    private Long userId;
 }

推荐阅读