2017-01-22 31 views
6

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.

Odpowiedz

6

znalazłem rozwiązanie. Muszę zmienić scenariusz dla tych One:

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

Następnie jednostka powinna być opatrzone tym:

@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

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

+0

@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

+0

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 –

0

SQL powinny być tak ..

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

Pozwól mi spróbować z tego skryptu – lbpeppers

+3

AUTO_INCREMENT nie działa na PostgreSQL – lbpeppers

+0

Dzięki za pomoc, tak czy inaczej. – lbpeppers