【问题标题】:How to check if username already exists in table?如何检查用户名是否已存在于表中?
【发布时间】:2022-01-17 15:10:28
【问题描述】:

我有 REST API 应用程序,当我创建一个具有相同用户名的用户时,它始终创建,但我希望用户名是唯一的,因为在实际应用程序中用户名对于每个用户都是唯一的,我如何提供检查数据库中的用户名? 当我使用已经存在的用户名创建用户时,我希望我的应用程序抛出一些消息,当然,不要保存已经存在的新用户用户名

我的用户实体:

@Table(name = "usr", uniqueConstraints=
@UniqueConstraint(columnNames={"username", "email"}))
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "role")
    private Role role;

    @Column(name = "email")
    private String email;

    @Column(name = "status")
    private Status status;

//    @OneToMany(mappedBy = "author")
//    private List<Message> messages;

//    @OneToMany(mappedBy = "author")
//    private List<Comment> comments;

    @OneToOne
    @JoinColumn(name = "gender_id")
    private Gender gender;

    @OneToOne
    @JoinColumn(name = "address_id")
    private Address address;

    @ManyToMany
    @JoinTable(
            name = "user_subscriptions",
            joinColumns =  @JoinColumn(name = "channel_id") ,
            inverseJoinColumns =  @JoinColumn(name = "subscriber_id"))
    private Set<User> subscribers;

    @ManyToMany
    @JoinTable(
            name = "user_subscriptions",
            joinColumns =  @JoinColumn(name = "subscriber_id") ,
            inverseJoinColumns =  @JoinColumn(name = "channel_id"))
    private Set<User> subscriptions;

    @OneToOne
    @JoinColumn(name = "file_id")
    private FileEntity fileEntity;

我的用户服务:

@Transactional
    public User save(UserRequest user) {
        provideAllUserCheckingActionsForSave(user);
        User userUntilSave = userMap.userRequestToUser(user,Role.USER,Status.ACTIVE);
        userUntilSave.setPassword(passwordEncoder.encode(userUntilSave.getPassword()));
        User saved = userRepo.save(userUntilSave);
        log.info("User save method invoked");
        return saved;
    }

【问题讨论】:

  • Spring 具有向控制器添加验证的能力:docs.spring.io/spring-framework/docs/3.2.x/… 您可以编写一个控制器类,该类将简单地调用数据库查询以检查用户名不存在。
  • 进行查询不是保证。在用户名字段上创建唯一索引并捕获异常并显示您想要的消息。
  • @M.Deinum 你能告诉我更多细节吗?
  • 您对用户名和电子邮件都有唯一的限制 - 这意味着您可以让多个用户使用相同的用户名,只要他们有不同的电子邮件地址 - 只有组合必须是唯一的。您可能需要单独的约束,一个用于用户名,一个用于电子邮件地址,以便在用户名用于其他人时引发异常。
  • @Chris 你能告诉我更多细节吗?

标签: java spring postgresql hibernate jpa


【解决方案1】:

您可以使用@unique 注解将唯一值存储在数据库中,如果它因未获取唯一值而引发异常,则应处理该异常。

【讨论】:

    【解决方案2】:

    创建用户前,可以通过用户名搜索用户,如果搜索结果为空,则创建新用户,如果搜索结果不为空,则处理问题。

    【讨论】:

      【解决方案3】:

      您可以向控制器添加验证,或者您可以简单地执行以下操作:- 当用户想要注册时,获取用户名并在数据库中搜索它是否已经存在。如果 findByUsername(username) 返回 null 则执行下一个操作并注册用户,否则返回一些错误消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-07
        • 2019-05-24
        • 2015-06-17
        • 2016-08-08
        • 1970-01-01
        • 2016-09-23
        相关资源
        最近更新 更多