Spring Boot-在失败的保存中某些东西会增加ID,为什么?

问题描述

我试图通过编写简单的API来学习Spring Boot。我将用户实体定义为:

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false,unique = true)
    private String login;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false,unique = true)
    private String email;

及其CRUD存储库:

public interface UserRepository extends CrudRepository<User,Long> {

    Optional<User> findByLogin(String name);
    List<User> findAll();
}

可能值得注意的是,我目前在docker容器中使用mySQL数据库。无论如何,我已经尝试处理用户可能提出的无效请求(例如字段缺失/不正确和重复),并提出了以下方法来检查并返回适当的错误。

    public User save(User user) {
        User savedUser;
        if(user.getEmail() == null || user.getLogin() == null || user.getPassword() == null)
            throw new IncorrectBodyException(user.toString());
        try {
            savedUser = userRepository.save(user);
        } catch (DataIntegrityViolationException e) {
            throw new UserDuplicateEntryException(e.getLocalizedMessage());
        }
        return savedUser;
    }

此方法效果很好,并且返回了正确的响应,但是它具有意外的错误(并且可能是错误的)。即使userRepository.save(user)抛出异常(例如关于重复的异常),它也会将该用户保存到数据库中,但是会增加总体ID。也就是说,如果我添加第一个用户,则其ID将为1,然后如果我尝试添加其重复项3次,则 NEXT 正确的用户ID将为5。因此最终将有2个用户在数据库中,id = 1之一,id = 5之一。

为什么会这样?有什么不好的吗我本来可以处理的更好的方法呢?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...