Ich habe Probleme beim Erstellen eines neuen Datensatzes in meiner PostgreSQL-Datenbank. Ich möchte nur einen neuen Benutzer mit dem REST-Service POST (int: id, String: E-Mail, String: Passwort), aber ich habe diesen Fehler:AutoIncrement Id PostgreSQL und Spring Boot-Daten 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
sind meine Java-Klassen sind:
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;
}
}
Dienst
@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
);
Bitte, hilf mir jemand, denn ich weiß nicht, wie dieses Problem in Angriff zu nehmen.
Dies trifft möglicherweise nicht auf Ihr Projekt zu, aber Sie sollten beachten, dass es einige Auswirkungen auf die Leistung gibt, wenn Sie die ID verwenden, die von der Datenbank generiert wird. Wenn die ID von der Datenbank generiert wird, muss JPA nach jedem Einfügen eine zusätzliche Abfrage verwenden, um die ID in den Persistenzkontext zu laden. Neben der Verdopplung der Anzahl der Anweisungen wird auch die Batch-Insert-Optimierung verhindert. –
@KlausGroenbaek Nun, ich weiß nicht viel über Datenbanken und Leistung. Also, was soll ich tun, um die automatisch generierte ID in meiner Datenbank zu ersetzen? – lbpeppers
Sie müssen möglicherweise nichts tun, wenn Sie viele Zeilen pro Transaktion einfügen. Wenn Sie das tun, sollten Sie sich den '@ TableGenerator' hier https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development ansehen/Entities/Ids/TableGenerator –