2017-01-22 11 views
6

私のPostgreSQLデータベースに新しいレコードを作成しようとして問題があります。AutoIncrement Id PostgreSQLとSpringのブートデータJPA

:これらは私のJavaクラスです

"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 

:私はこのエラーを抱えているが、(パスワード:ID、文字列::電子メール、文字列INT)私は、RESTサービスに新しいユーザーを投稿したいです

ドメイン

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

コントローラ

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

サービス

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

リポジトリ

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

してください、私はこの問題に取り組むために方法を知らないので、誰かが、私を助けて。

答えて

6

私は解決策を見つけました。私はこれらのいずれかのスクリプトを変更する必要があります。そして、

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

を、エンティティがこれに注釈を付けする必要があります。

@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

これはプロジェクトには当てはまらないかもしれませんが、データベースによって生成されたIDを使用することにパフォーマンスに影響があることに注意してください。 IDがデータベースによって生成されるとき、JPAは永続コンテキストにIDをロードするたびに追加のクエリを使用する必要があります。ステートメントの数を2倍にすることに加えて、バッチインサートの最適化もできません。 –

+0

@KlausGroenbaekまあ、私はあまりデータベースとパフォーマンスについて知りません。ですから、私のデータベースの自動生成されたIDを置き換えるにはどうすればよいですか? – lbpeppers

+0

トランザクションごとにたくさんの行を挿入しない限り、何もする必要はありません。そうした場合は、ここで '@ TableGenerator'を見てください。https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Ids/TableGenerator –

0

SQLは、次のようにする必要があります。..

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

は私がAUTO_INCREMENTは、PostgreSQL上のため – lbpeppers

+3

にしてみましょうとにかく、助け。 – lbpeppers

+0

おかげで動作しません。そのスクリプト – lbpeppers

関連する問題