Mam problemy podczas próby utworzenia nowego rekordu w mojej bazie danych PostgreSQL. Chcę tylko pocztą na usługi REST nowego użytkownika (int id, string: email, String: hasło), ale mam ten błąd:AutoIncrement Id PostgreSQL i 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
Są to moje klasy Java:
Domain
@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;
}
}
Controller
@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;
}
}
usługi
@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
);
proszę, ktoś może mi pomóc, bo nie wiem, jak rozwiązać ten problem.
To może nie mieć zastosowania do twojego projektu, ale powinieneś zdawać sobie sprawę, że są pewne konsekwencje związane z używaniem id generowanych przez bazę danych. Kiedy identyfikator jest generowany przez bazę danych, JPA musi użyć dodatkowego zapytania po każdym wstawieniu, aby załadować identyfikator do kontekstu utrwalania. Oprócz podwojenia liczby wyciągów, zapobiega to również optymalizacji wstawiania partii. –
@KlausGroenbaek Cóż, nie wiem zbyt wiele o bazach danych i wydajności. Co powinienem zrobić, aby zastąpić autogenerowany identyfikator w mojej bazie danych? – lbpeppers
Nie musisz nic robić, chyba że wstawiasz wiele wierszy na transakcję, jeśli to zrobisz, powinieneś spojrzeć na '@ TableGenerator' tutaj https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Ids/TableGenerator –