【问题标题】:System of User/Role , how to implement other attributes?用户/角色系统,如何实现其他属性?
【发布时间】:2018-10-01 10:42:48
【问题描述】:

我正在使用 Spring Boot 开发一个应用程序,因此我使用的 UML 类有 3 个实体:

  1. 管理员(ID、用户名、密码、电子邮件)
  2. 经理(ID、用户名、密码、电子邮件、电话)
  3. 客户(ID、用户名、密码、电子邮件、电话、地址)

Admin 与 Manager 有一对多/多对一的映射 也可以与实体 Client 一对多/多对一。

经过一些研究,我将其更改为 User/Role System ,因此实体 User 有这样的属性:

    public class AppUser implements Serializable {

    @Id @GeneratedValue
    private Long id;
    @Column(unique = true)
    private String username;
    private String password;
    @ManyToMany(fetch = FetchType.EAGER)
    private Collection<AppRole> roles = new ArrayList<>();
}

以及角色实体

 public class AppRole implements Serializable {

        @Id @GeneratedValue
        private Long id;
        private String roleName;

}

我应该怎么做来实现其他实体,经理和客户,因为他们有其他不同的属性?

由于只有一个实体,我现在应该如何实现映射?

提前谢谢你。

【问题讨论】:

  • 这是什么? UML 问题还是实现问题?
  • @ThomasKilian 首先感谢您的回答,这是一个 UML 问题,所以我可以在代码的最后实现这些类,我想用这些类的实现来解释我的问题。
  • 你的问题不清楚,请多解释。
  • @manuka_m okey 让我向您解释一下:我正在使用三个实体 Admin 、 Manager 、 Client ,它们没有与帖子中相同的属性,之后我决定使用两个实体:AppUser 和 AppRole 而不是使用三个实体(使用 spring security everthing 对角色等都很好),在帖子中你可以看到我只声明了三个属性 id、用户名、密码,所以我应该添加另一个实体appUser中经理和客户的属性?或者我应该创建两个继承类 appUser 的实体管理器和客户端?
  • 另一个问题关于我正在使用的ORM mappig(管理员和经理之间,还有管理员和客户端之间),管理员可以添加/删除经理/客户端..

标签: hibernate jpa orm


【解决方案1】:

我认为您应该在 AppUser 类中添加这些字段并在需要时插入数据。例如,在创建 Manager 时,您可以输入 admin_id 并将 client_id 留空。这样一个admin 下也可以有多个managers

@Entity
@Table(name = "AppUser")
public class AppUser implements Serializable {

    @Id @GeneratedValue
    private Long id;
    @Column(unique = true)
    private String username;
    private String password;
    @Column(unique = true)
    private String email;
    @Column(unique = true)
    private String phone;
    private String address;
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Collection<AppRole> roles = new ArrayList<>();
    @ManyToOne
    @JoinColumn(name = "client_id")
    private AppUser client;
    @ManyToOne
    @JoinColumn(name = "manager_id")
    private AppUser manager;
    @ManyToOne
    @JoinColumn(name = "admin_id")
    private AppUser admin;
}

然后您可以根据您的要求将各自的roles 分配给每个appUser。 如果您还没有使用Spring Security,那么您应该将它用于角色和权限。

【讨论】:

  • 首先感谢您的回答,是的,我已经在使用 Spring Security,我有一个实体角色,它为每个 appUser 赋予各自的角色,我还有一个问题,要将数据插入到这个实体中我使用扩展 JPaRepository 的接口,那么我将如何指定该用户是管理员等?我应该在这个界面中创建自己的方法来指定那个用户吗?您的解决方案是否比创建两个扩展应用程序用户实体的实体更好?提前谢谢你。
  • 是的 JpaRepository 将完成这项工作,因为它已经有 CRUD 方法。您需要做的是 1)在您的 AppRole 类中添加 3 个角色,然后 2)为用户分配一个角色,然后 3)保存。像这样:AppRole role = roleRepo.findByRoleName("ROLE_ADMIN"); Collection&lt;AppRole&gt; roles = new ArrayList&lt;&gt;(); roles.add(role); user.setRoles(roles); userRepo.save(user);
  • 非常感谢您的帮助,映射呢,是一对多还是多对一?例如,管理员将有多个经理在他下面。
  • 如果有帮助,请接受答案。您需要了解这两者之间的差异,请查看stackoverflow.com/a/19924648/4704510
  • 感谢您的帮助,非常感谢 :)
猜你喜欢
  • 2018-09-23
  • 2011-02-19
  • 2014-12-02
  • 2013-08-01
  • 2013-04-06
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多