【问题标题】:Java JPA enum-like String optionsJava JPA 类枚举字符串选项
【发布时间】:2022-01-16 21:47:24
【问题描述】:

为了安全起见,我正在尝试在 Spring 应用程序中实现简单的用户角色关系。基本实体(一些字段和注释被修剪):

用户

@Table(name="usr")
public class User implements Serializable {
  @Id
  private UUID id;
  @ManyToMany(fetch=FetchType.EAGER)
  @JoinTable(name="user_roles", joinColumns=@JoinColumn(name="user_id", referencedColumnName="id"),
    inverseJoinColumns=@JoinColumn(name="role_id", referencedColumnName="id"))
  private Collection<Role> roles;
}

角色

public class Role implements Serializable {
  @Id
  private UUID id;
  @ManyToMany(mappedBy="roles")
  private Collection<User> users;
  private String name;
}

到目前为止,一切都很好。但是,我还有一个定义角色名称值列表的类:

用户角色

public class UserRole {
 public static final String ADMIN = "admin";
 public static final String USER = "user";
}

我想将Rolename 字段的值限制为UserRoles 中的值,就像一个枚举一样。

这些role 值将在要求角色为字符串值的 Spring Security 函数中使用。因此,如果我将UserRoles 设为枚举,则任何数据库存储都将是ints——UserRoles 中的序数定义位置——这将迫使我保留任何可能被弃用的选项,并且还需要一个 hacky每次我需要将role 转换为可以在 JWT 等中传递的字符串时都进行转换。(如果我想直接查看我的数据库,它的信息量也会少得多。)

有没有办法将Role 的名称字段定义为仅限于UserRoles 中的静态值? (更改这些值的存储方式或存储位置是完全可以接受的。)

【问题讨论】:

    标签: java security jpa enums


    【解决方案1】:

    你可以这样定义

    public enum UserRoleEnum {
      USER, ADMIN
    }
    

    在实体中

    @Enumerated(EnumType.ORDINAL)
    private UserRoleEnum role;
    

    【讨论】:

    • 谢谢。虽然我怀疑你的意思是@Enumerated(EnumType.STRING),因为我特别说过我想避免使用序数。您的回答确实让我找到了baeldung.com/jpa-persisting-enums-in-jpa,它为我提供了 JPA 2.1 @Converter 方法。相应地更新以供接受。
    猜你喜欢
    • 2011-10-10
    • 2021-11-16
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多