【问题标题】:Issue creating users on simple spring boot crud api在简单的 spring boot crud api 上创建用户的问题
【发布时间】:2018-09-21 20:12:45
【问题描述】:

第一次启动 api 后,前 3 个用户创建帖子请求失败(帖子底部的屏幕截图)并出现以下错误(唯一约束违规)。

后续请求正常工作,第一个创建的用户的 id 为 4,然后是 5,依此类推...

如何在前 (3) 次尝试中创建用户?

我怀疑这与我的用户的预播有关,我正在使用以下脚本执行此操作。可能自动 ID 生成首先尝试 1、2、3 —— 哪些已经在使用?

INSERT INTO user VALUES (1, 'user1', 'pass1', 'ADMIN'); INSERT INTO user VALUES (2, 'user2', 'pass2', 'USER'); INSERT INTO user VALUES (3, 'user3', 'pass3', 'ADMIN')

无法执行语句; SQL [不适用];约束 [\"PRIMARY KEY ON PUBLIC.USER(ID)\"; SQL 语句:\n插入用户(姓名、密码、 角色,id)值(?,?,?,?)[23505-196]];嵌套异常是 org.hibernate.exception.ConstraintViolationException:不能 执行语句",

@RestController
public class UserResource {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/users")
    public List<User> retrievaAllUsers() {
        return userRepository.findAll();
    }

    @DeleteMapping("/users/{id}")
    public void deleteUser(@PathVariable Long id) {
        userRepository.deleteById(id);
    }

    @PostMapping("/users")
    public ResponseEntity<Object> createUser(@RequestBody User user) {
        User savedUser = userRepository.save(user);

        URI location = ServletUriComponentsBuilder.fromCurrentRequest()
                .path("/{id}")
                .buildAndExpand(savedUser.getId())
                .toUri();

        return ResponseEntity.created(location).build();

    }


}

-

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String password;
    @Enumerated(EnumType.STRING)
    private Role role;

    public User() {
        super();
    }

    public User(Long id, String name, String password, Role role) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.role = role;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }
}

  • 编辑 - 添加角色类

    public enum Role {
    
    USER, ADMIN
    

    }

【问题讨论】:

  • Role类的结构是什么?
  • @benjaminc 已编辑以包含源代码
  • 如果表中没有数据,是否有效?
  • 默认策略是 GenerationType.AUTO @benjaminc 。两者都一样。
  • 如果您在列定义中使用 AUTO_INCREMENT,请尝试将策略从 GenerationType.Auto 更改为 GenerationType.Identity

标签: java spring spring-boot spring-rest


【解决方案1】:

如果您在列定义中使用 AUTO_INCREMENT,请尝试将策略从 GenerationType.AUTO 更改为 GenerationType.IDENTITY

当我将项目从 Spring Boot 1.5 升级到 2.0 时,我注意到了类似的行为。

【讨论】:

    【解决方案2】:

    只是一个假设。首先,您正在使用 sql 插入数据,但在您的代码中,您正在创建新用户并保存到 db。所以这个新创建的 id 为1。但是您的数据库有一条用户记录,其主键为1。请从 db 中删除所有值并从 rest 控制器创建您的记录。

    在我看来,使用这样的序列,不要忘记在数据库中创建序列;

    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_generator")
    @SequenceGenerator(name="user_generator", sequenceName = "user_seq", allocationSize=50)
    

    或阅读本文并选择您要解决的问题。

    • AUTO:Hibernate 根据所使用的选择生成策略 方言,
    • IDENTITY:Hibernate 依赖于自动递增的数据库列 生成主键,
    • SEQUENCE:Hibernate 从数据库请求主键值 序列,
    • TABLE:Hibernate 使用数据库表来模拟序列。

    PS:身份应该更相关,但请尝试其他。

    【讨论】:

      【解决方案3】:

      您还应该提供列名以确保它是有序的。

      INSERT INTO 用户(ID、名称、密码、角色) 值(1,'user1','pass1','ADMIN');

      INSERT INTO 用户(ID、名称、密码、角色) 值(2,'user2','pass2','USER');

      INSERT INTO 用户(ID、名称、密码、角色) 值(3,'user3','pass3','ADMIN')

      【讨论】:

        猜你喜欢
        • 2021-06-28
        • 2021-09-20
        • 2019-07-24
        • 2019-01-03
        • 1970-01-01
        • 2018-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多