【问题标题】:What is the most efficient way to map @ManyToMany relationship with JPA and Hibernate?将@ManyToMany 关系映射到 JPA 和 Hibernate 的最有效方法是什么?
【发布时间】:2020-11-24 10:10:53
【问题描述】:

我只知道 DB 和 JPA/Hibernate 的基础知识。我必须管理一个用户表,其中一个用户可以有很多角色。这些角色包含在一个目录表中,在我的用户公式中我不假装管理/修改,我只需要目录值作为添加或删除我的用户的参考。 我认为最好的方法是在 User 和 Role 之间创建一个关系表来保存用户及其角色“User_Roles”(除非有更有效的方法)。

我不允许修改 Role 实体,因为它在我的应用程序的许多其他独立于 User 表的区域中用于不同目的。

我看过很多例子,但我仍然不知道哪一个最适合我的特定需求。如何使用 JPA 和 Hibernate 将我的用户及其角色映射到单个实体中?

也许下一张图片更好地描述了我想要的东西:

非常感谢您的回答。

【问题讨论】:

    标签: java hibernate jpa many-to-many hibernate-mapping


    【解决方案1】:

    您所描述的是一对多关系,但它位于 User 和连接表 - User_Roles 之间。由于您无法避免加入表,因此最好的办法是使用 @ManyToMany@JoinTable 注释来映射关系。请记住使用Set 而不是List。那么你就不需要joinint表的实体了。

    您可以在this blog post 找到有关此主题的讨论。

    【讨论】:

    • 感谢您的回答。我不应该修改实体角色,因为它是在应用程序的其他一些地方使用的目录持有者。它拥有比我需要的更多的值,我只需要 id1=10 和 id2=30 的值。我听起来那么我需要为 joinint 表创建一个实体,还是?那时会是什么样子?
    【解决方案2】:

    在您的情况下,您必须使用 @ManyToMany 来关联两个表。

    那应该看这个:

    @Entity
    @Table(name = "User")
    public class User { 
       ...
       @ManyToMany
       @JoinTable(name = "User_Roles", joinColumn = "id_person")
       private Set<Role> roles = new HashSet<>;
    }
    
    @Entity
    @Table(name = "Role")
    public class Role { 
       ...
       @ManyToMany(mappedBy = "roles")
       private Set<User> users = new HashSet<>;
    }
    

    【讨论】:

    • 感谢您的回答!但是我不允许修改角色实体/表,因为这是一个为不同的角色保存不同卷的表,我只需要 id1=10 和 id2=30 的角色,所有其他角色都不适用于用户公式。我怎么能做到这一点?
    【解决方案3】:

    根据您上面的屏幕,我理解的用户可以分配多个角色。 即 1 个用户可以映射到多个角色,1 个角色可以映射到多个用户。

    因此用户和角色之间的关系是多对多的。

    多对多关系可以使用第三个表实现,称为映射表。

    所以,我们在您的示例中有以下表格:-

    • 用户

    • 用户角色

    • 角色

        @Entity
       @Table(name = "user")
       @JsonInclude(JsonInclude.Include.NON_NULL)
       public class User {
           @Id
           @SequenceGenerator(name = "USER_ID_GENERATOR", sequenceName = "USER_SEQ",
                   allocationSize = 1)
           @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_ID_GENERATOR")
           @Column(name = "user_id")
           private Long userId;
      
           @OneToOne
           @JoinColumn(name = "persion_id")
           private person person;`
           enter code
           here`
      
           @Basic
           @Column(name = "date")
           private Date date;
      
           @Basic
           @Column(name = "observations")
           private String observations;
      
           @Basic
           @Column(name = "text")
           private String text;
      
           @JsonIgnore
           @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
           private List<UserRoles> users = new ArrayList<>();
      
       }
      

      @实体 @表(名称=“角色”) @JsonInclude(JsonInclude.Include.NON_NULL) 公共类角色 {

       @Id
       @SequenceGenerator(name = "ROLE_ID_GENERATOR", sequenceName = "ROLE_SEQ",
               allocationSize = 1)
       @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ROLE_ID_GENERATOR")
       @Column(name = "role_id")
       private Long roleId;
      
       @Basic
       @Column(name = "id1")
       private Long idOne;
      
       @Basic
       @Column(name = "id1")
       private Long idTwo;
      
       @Basic
       @Column(name = "id1")
       private Long idThree;
      
       @Basic
       @Column(name = "text")
       private String text;
      
       @JsonIgnore
       @OneToMany(mappedBy = "role", cascade = CascadeType.ALL)
       private List<UserRoles> users = new ArrayList<>();
      

      }

      @实体 @Getter @Setter @Table(name = "user_roles") @JsonInclude(JsonInclude.Include.NON_NULL) @已审核 公共类用户角色 {

       private static final long serialVersionUID = 1L;
      
       @EmbeddedId
       UserRolesKey userRoleId;
      
       @JsonIgnore
       @ManyToOne(fetch = FetchType.LAZY)
       @MapsId("role_id")
       @JoinColumn(name = "role_id")
       Roles role;
      
       @JsonIgnore
       @ManyToOne(fetch = FetchType.LAZY)
       @MapsId("user_id")
       @JoinColumn(user_id)
       User user;
      
       @PrePersist
       private void prePersist() {
           super.onPrePersist();
           if (this.getId() == null) {
               UserRolesKey mapKey = new UserRolesKey();
               mapKey.setRoleId(this.getRole().getRoleId());
               mapKey.setUserRoleId(this.getUser().getUserId());
               this.setId(mapKey);
           }
       }
      

      }

    在保存时,您只需要使用所有 uaerRoles 映射实体填充用户实体并将其持久化。 jpa 将保存所有详细信息。

    在更新分配给用户的角色时,您需要获取用户实体并通过添加新的 userRoles 实体并取消将要删除的时间来更新映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 2015-02-28
      • 1970-01-01
      • 2020-04-15
      • 2011-10-27
      • 2011-06-26
      • 1970-01-01
      相关资源
      最近更新 更多