代码之家  ›  专栏  ›  技术社区  ›  ab11

在simple spring boot crud api上创建用户的问题

  •  1
  • ab11  · 技术社区  · 7 年前

    首次启动api后,前3个用户创建Post请求失败(Post底部的屏幕截图),出现以下错误(唯一约束位置)。

    随后的请求可以工作,第一个创建的用户的id是4,然后是5,以此类推。。。

    如何使用户创建在第一(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[不适用];上的约束[\”主键 PUBLIC.USER(ID)\“;SQL语句:\n插入用户(名称、密码、, 角色,id)值(?,?,?)[23505-196]];嵌套异常为 执行语句“,

    @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;
        }
    }
    

    enter image description here

    • 编辑-添加角色类

      public enum Role {
      
      USER, ADMIN
      

      }

    3 回复  |  直到 7 年前
        1
  •  1
  •   The Gilbert Arenas Dagger iainpb    7 年前

    如果在列定义中使用自动增量,请尝试从 GenerationType.AUTO GenerationType.IDENTITY

    当我将一个项目从springboot1.5升级到2.0时,我注意到了类似的行为。

        2
  •  1
  •   drowny    7 年前

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

    在我看来,使用这样的sequence,别忘了在db中创建sequence;

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

    或者读这篇文章,然后选择你要解决的问题。

    • 方言,
    • 身份
    • 顺序 顺序,
    • :Hibernate使用数据库表来模拟序列。

    附言: 身份应该更相关,但尝试其他人。

        3
  •  1
  •   sovannarith cheav    7 年前

    插入用户(id、名称、密码、角色) 值(1,'user1','pass1','ADMIN');

    插入用户(id、名称、密码、角色)

    插入用户(id、名称、密码、角色) 值(3,'user3','pass3','ADMIN')