Hibernate - 具有枚举角色的用户由第三个表处理

Posted

技术标签:

【中文标题】Hibernate - 具有枚举角色的用户由第三个表处理【英文标题】:Hibernate - user with enum roles handled with a third table 【发布时间】:2020-06-30 21:23:27 【问题描述】:

我目前正在为后端进行用户管理。用户应该有不同的权利。为此,我使用 Hibernate 将用户和角色存储为 manyToMany 关系。我想实现如下结构:

为了避免“免费”权限,我会将角色作为枚举保留在每个用户的列表中。不幸的是,Hibernate 没有为我创建中间表,我不知道如何让 hibernate 为我创建它。

用户.java

@Entity
@Table(name = "user")
@XmlRootElement
public class User implements Serializable 

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "user_id")
    private int id;
    
    @Column(nullable=false)
    @FormParam("username")
    private String username;
    
    @Column(nullable=false)
    @FormParam("password")
    private String password;
    
    private String firstName;
    private String lastName;
    private String email;
    private boolean isActive;
    
    @ElementCollection(targetClass = Role.class, fetch=FetchType.EAGER)
    @Enumerated(EnumType.STRING)
    @CollectionTable(name="user_roles")
    @Column(name="role") 
    private Set<Role> roles;

    getters and setters

角色.java

public enum Role 
    
    ADMIN("admin","Full access"),
    LOGIN("login","Just for login");
    
    @Id
    @GeneratedValue
    @Column(name = "role_id")
    private int id;
    @Column(name = "role")
    private String role;
    @Column(name = "description")
    private String description;

    
    private Role(String role, String description) 
        this.role = role;
        this.description = description;
    

    getters and setters

Ich habe auch versucht eine Zwischentabelle "UserRole" mit einer Klasse zu erreichen,halte ich aber nicht für wirklich richtig bzw。 sehr umständlich。 Ich glaube das meine Annotationen noch nicht Richtig sind und würde mich um einen Tipp freuen.

我的设置是使用 JPA2.1 休眠的。我的数据库是当前的mysql版本。

【问题讨论】:

【参考方案1】:

在 N 到 M 关系中,您需要一个中间表,它在两个实体之间创建关系。

没有@Join .. (table, column) 注解的实体没有关系。

要对该中间表的实体进行建模,新实体并不是绝对必要的,您应该使用@JoinTable 注解,如下所示:

用户实体

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USERS_ROLE", 
           joinColumns =  @JoinColumn(name = "ID_USER") , 
           inverseJoinColumns = 
                @JoinColumn(name = "ID_ROLE")
           )
private Set<Role> roles;

角色实体(如果需要)

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "USERS_ROLE", 
           joinColumns =  @JoinColumn(name = "ID_ROLE") , 
           inverseJoinColumns = 
                @JoinColumn(name = "ID_USER")
           )
private Set<User> users;

【讨论】:

以上是关于Hibernate - 具有枚举角色的用户由第三个表处理的主要内容,如果未能解决你的问题,请参考以下文章

hibernate多对多

具有 Oracle 标签安全性的 JPA/Hibernate

hibernate多对多关联映射

Spring Boot 中的 Hibernate 无法懒惰地初始化角色集合,无法初始化代理 - 没有 Session 异常

Hibernate:防止角色表中有多个相同的条目

Hibernate 多对多