在简单的Spring Boot Crud API上创建用户时出现问题

时间:2018-09-21 20:12:45

标签: java spring spring-boot spring-rest

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

后续请求有效,第一个创建的用户的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 [n / a];约束[\“ 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;
    }
}

enter image description here

  • 编辑-添加了角色类

    public enum Role {
    
    USER, ADMIN
    

    }

3 个答案:

答案 0 :(得分:1)

如果您在列定义中使用了AUTO_INCREMENT,请尝试将策略从IconButton( iconSize: 30.0, onPressed: () => _showDialog(context), icon: Icon( Icons.clear, color: Colors.white, ), 更改为GenerationType.AUTO

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

答案 1 :(得分:1)

只是一个假设。首先,您要使用sql插入数据,但是在代码中,您将创建新用户并将其保存到db。因此,此新创建的ID为public class Test1 { public static void main(String[] args) { System.out.println("Class 1"); Test2.main(args); Test3.main(args); } } ... public class Test2 { public static void main(String[] args) { System.out.println("Class 2"); } } ... public class Test3 { public static void main(String[] args) { System.out.println("Class 3"); } } 。但是您的数据库有一条用户记录,该记录的主键为1。请从db中删除所有值,并从rest控制器创建记录。

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

1

或者阅读此书,然后选择要解决的问题。

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

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

答案 2 :(得分:1)

您还应该提供列名,以确保其顺序。

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

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

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