代码之家  ›  专栏  ›  技术社区  ›  Rüdiger

将Spring Boot Jpa中的三个实体相互连接时出现问题

  •  2
  • Rüdiger  · 技术社区  · 5 年前

    project 在我的数据库里。每个 users user projects . 这将是一部经典之作 ManyToMany

    设置我的实体并将它们连接起来:

    @Entity
    public class User {
      @id
      @Column(name="ID")  
      public int id;
    
      @ManyToMany
      public Set<Project> projectSet;
    }
    
    @Entity
    @Table(name="PROJECT")
    public class Project {
      @id
      @Column("ID")
      private int id;
    
      @ManyToMany
      private Set<User> users;
    }
    

    实现我的存储库:

    @Repository
    public interface ProjectRepo implements JpaRepository<Project, Integer> {
      public Set<User> getAllUsers();
    }
    

    现在让我们假设我想指定每个用户在这个项目中的角色。所以我想要一张桌子 role

    @Entity
    @Table(name="ROLES")
    public class Role {
      @id
      @Column(name="ID")
      private int id;
    
      @Column(name="DESCRIPTION")
      private String description;
    }
    

    但这与我的用户和项目有什么联系呢?所以我想展示的是,一个用户可以在一个项目中有一个角色,但在许多项目中有许多角色。此外,一个角色可以分配给一个或多个项目中的多个用户,一个项目可以有多个用户,其中每个用户只有一个角色,但有多个角色。如果我简单地添加一个 @ManyToMany Set<Roles> roleSet 对我 Users ,我不能说哪个用户将在哪个项目中扮演哪个角色。那么如何描述呢?我需要创建第三个类来连接它们吗?

    编辑1:

    为了澄清,我将尝试在marknote的回答中提供建议的代码-

    假设我有上面的课程( Project , User Role

    所以我要创建一个新类 Assignment ,我的 项目 还有我的 角色 .

    @Entity
    @Table(name="USER")
    public class User {
      @id
      @Column(name="id")
      private int id;
    
      @Column(name="firstname")
      private String firstname;
    
      @Column(name="lastname")
      private String lastname;
    
      @OneToMany
      private List<Assignment> assignments;
      //getters and setters and stuff
    }
    
    @Entity
    @Table(name="PROJECT")
    public class Project {
      @id
      @Column(name="PNUM")
      private String pnum;
    
      @Column(name="PNAME")
      private String pname;
    
      @OneToMany
      private List<Assignment> assignments;
      //getters and setters and stuff
    }
    
    @Entity
    @Table(name="ROLE")
    public class Role {
      @id
      @Column(name="id")
      private int id;
    
      @Column(name="DESCRIPTION")
      private String description;
    
      @OneToMany
      private List<Assignment> assignments;
      //getters and setters and stuff
    }
    

    到目前为止还可以,所以我将创建以下内容 分配 -班级。我需要能够从 使用者 以及 角色 ,所以我需要这三个字段。让我们来设计(通常的)用例:桌子 分配 使用者 项目 角色 通过将FKs中的PK组合到名称表。现在,Spring Boot JPA中的组合PK通常(据我所知)在使用 @Embeddable -注释。从这个角度来看,我会做以下几点:

    @Embeddable
    public class AssignmentId implements Serializable {
      private User user;
      private Project project;
      private Role role;
    }
    

    -类别至:

    @Entity
    @Table(name="ASSIGNMENT")
    public class Assignment {
      @EmbeddedId
      private AssignmentId assignmentId;
    }
    

    现在这样做时,我在尝试运行spring boot时遇到以下错误:

    有人能解释这个错误吗?这可能是一个问题 @EmbeddedId 我想。

    编辑2

    @Embedded Entity 对于元素:

    private Role role;
    private Project project;
    private User user;
    
    1 回复  |  直到 5 年前
        1
  •  3
  •   marknote    5 年前

    取决于您的业务需求。 假设用户在项目中的角色不同,您可以引入另一个类 Assignment ,然后变成3 @OneToMany enter image description here

    User , Project , Role 分配 @ManyToOne ,但您可能需要也可能不需要使用 @独身癖 . 有一篇关于实现的最佳实践的非常好的文章 : https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate 感谢@vlad mihalcea