2017-01-22 27 views
6

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.

Trả lời

6

Tôi tìm thấy giải pháp. Tôi cần phải thay đổi kịch bản cho những ai:

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

Sau đó, Entity nên được chú thích với điều này:

@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

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

+0

@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

+0

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 –

0

SQL nên như thế này ..

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

Hãy để tôi thử với kịch bản mà – lbpeppers

+3

Các AUTO_INCREMENT không hoạt động trên PostgreSQL – lbpeppers

+0

Cám ơn sự giúp đỡ, dù sao đi nữa. – lbpeppers

Các vấn đề liên quan