2017-01-22 4 views
6

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.

Antwort

6

ich die Lösung gefunden. Ich brauche, um das Skript zu ändern für diese ein:

CREATE TABLE users(
    id SERIAL PRIMARY KEY NOT NULL, 
    email TEXT NOT NULL, 
    password TEXT NOT NULL 
); 

Dann sollte die Entity mit diesen Anmerkungen versehen werden:

@Entity 
@Table(name = "users") 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(columnDefinition = "serial") 
    private Long id; 
    private String email; 
    private String password; 

    public User() {} 

    public Long getId() { 
    return id; 
    } 

    public void setId(Long 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; 
    } 
} 
+0

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. –

+0

@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

+0

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 –

0

SQL sollte so sein ..

CREATE TABLE users(
    id INT PRIMARY KEY BIGINT NOT NULL AUTO_INCREMENT, 
    email TEXT NOT NULL, 
    password CHAR(20) NOT NULL 
); 
+0

Lassen Sie mich versuchen, mit diesem Skript – lbpeppers

+3

Der AUTO_INCREMENT nicht auf PostgreSQL funktioniert – lbpeppers

+0

Vielen Dank für die Hilfe jedenfalls. – lbpeppers