2017-01-22 17 views
6

PostgreSQL veritabanımda yeni bir kayıt oluşturmaya çalışırken sorun yaşıyorum.AutoIncrement Id PostgreSQL ve Spring Boot Verileri JPA

: Bunlar benim Java sınıfları vardır

"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 

: Ben bu hatayı yaşıyorum ama (şifre: id, Dize: e-posta, dize int) Sadece DİNLENME hizmetine yeni bir kullanıcı POST istiyorum

Alan

@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; 
    } 
} 

Kontrolör

@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; 
    } 
} 

Servis

01 Bu sorunu çözmek için nasıl bilmiyorum çünkü
@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; 
    } 
} 

Depo

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 
); 

, biri, bana yardım edin.

cevap

6

çözüm bulundu. Bunları biri için komut dosyası değiştirmek gerekir: Sonra

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

, Varlık bu ek not edilmelidir:

@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

Bu, projeniz için geçerli olmayabilir, ancak veritabanı tarafından kimlik oluşturmanın kullanılmasının bazı performans sonuçları olduğunun farkında olmalısınız. Kimlik veritabanı JPA tarafından oluşturulduğunda, her bir ekleme işleminden sonra kimliğin kalıcılık bağlamına yüklenmesi için ek bir sorgu kullanması gerekir. İfadelerin sayısını iki katına çıkarmanın yanı sıra, parti eki optimizasyonunu da engeller. –

+0

@KlausGroenbaek Veritabanları ve performans hakkında çok fazla şey bilmiyorum. Peki, otomatik olarak oluşturulmuş kimliği veritabanımda değiştirmek için ne yapmalıyım? – lbpeppers

+0

İşlem başına çok sayıda satır eklemediğiniz sürece hiçbir şey yapmanız gerekmeyebilir, eğer bunu yaparsanız, buradaki https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Ids/TableGenerator –

0

SQL böyle olmalı ..

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

beni AUTO_INCREMENT PostgreSQL üzerinde için – lbpeppers

+3

ile deneyelim Yine de yardım. – lbpeppers

+0

Teşekkür çalışmıyor o senaryo – lbpeppers

İlgili konular