【发布时间】: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