Tôi gặp sự cố khi cố tạo bản ghi mới trong cơ sở dữ liệu PostgreSQL của mình. Tôi chỉ muốn đường bưu điện đến dịch vụ REST một người dùng mới (int: id, String: email, String: mật khẩu) nhưng, tôi đang gặp lỗi này:AutoIncrement Id PostgreSQL và Spring Boot Data JPA
"exception": "org.springframework.dao.DataIntegrityViolationException",
"message": "could not execute statement; SQL [n/a]; constraint [id]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
Đây là những lớp Java của tôi:
miền
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String email;
private String password;
public User() {}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
khiển
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(method = RequestMethod.GET)
public List<User> findAll() {
return userService.findAll();
}
@RequestMapping(method = RequestMethod.POST)
public User addUser(@RequestBody User user) {
userService.addUser(user);
return user;
}
}
Dịch vụ
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> findAll() {
return (List<User>) userRepository.findAll();
}
public User addUser(User user) {
userRepository.save(user);
return user;
}
}
Repository
public interface UserRepository extends CrudRepository<User, Integer> {
// TODO
}
SQL
CREATE TABLE users(
id INT PRIMARY KEY NOT NULL,
email TEXT NOT NULL,
password CHAR(20) NOT NULL
);
Xin vui lòng, ai đó giúp tôi, bởi vì tôi không biết làm thế nào để giải quyết vấn đề này.
Điều này có thể không áp dụng cho dự án của bạn, nhưng bạn nên lưu ý rằng có một số tác động hiệu quả đối với việc sử dụng id do cơ sở dữ liệu tạo ra. Khi ID được tạo ra bởi cơ sở dữ liệu JPA phải sử dụng một truy vấn bổ sung sau mỗi lần chèn để nạp id vào ngữ cảnh kiên trì. Ngoài việc tăng gấp đôi số lượng câu lệnh, nó cũng ngăn chặn tối ưu hóa chèn hàng loạt. –
@KlausGroenbaek Vâng, tôi không biết quá nhiều về cơ sở dữ liệu và hiệu suất. Vì vậy, tôi nên làm gì để thay thế id được tạo tự động trong cơ sở dữ liệu của tôi? – lbpeppers
Bạn có thể không cần phải làm bất cứ điều gì trừ khi bạn đang chèn rất nhiều hàng cho mỗi giao dịch, nếu bạn làm điều đó bạn nên xem xét '@ TableGenerator' tại đây https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Ids/TableGenerator –