Java 自动增量Id PostgreSQL和Spring引导数据JPA

Java 自动增量Id PostgreSQL和Spring引导数据JPA,java,spring,postgresql,jpa,Java,Spring,Postgresql,Jpa,我在PostgreSQL数据库中创建新记录时遇到问题。我只想向REST服务发布一个新用户(int:id,String:email,String:password),但出现以下错误: "exception": "org.springframework.dao.DataIntegrityViolationException", "message": "could not execute statement; SQL [n/a]; constraint [id]; nested exception i

我在PostgreSQL数据库中创建新记录时遇到问题。我只想向REST服务发布一个新用户(int:id,String:email,String:password),但出现以下错误:

"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
以下是我的Java类:

领域

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

请帮帮我,因为我不知道如何解决这个问题。

SQL应该是这样的

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

我找到了解决办法。我需要更改以下脚本:

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

让我尝试使用该脚本谢谢您的帮助。PostgreSQL的数据类型有smallserial、serial和bigserial。这可能不适用于您的项目,但您应该知道,使用数据库生成的id会影响性能。当数据库生成ID时,JPA必须在每次插入后使用附加查询将ID加载到持久性上下文中。除了将语句数量增加一倍外,它还阻止了批插入优化。@KlausGroenbaek嗯,我对数据库和性能了解得不多。那么,我应该怎么做来替换数据库中自动生成的id呢?您可能不需要做任何事情,除非您在每个事务中插入很多行,如果您这样做,您应该查看
@TableGenerator
,这里您不需要创建表脚本-表是由JPA自动生成的。
CREATE TABLE users(
    id INT PRIMARY KEY BIGINT NOT NULL AUTO_INCREMENT,
    email TEXT NOT NULL,
    password CHAR(20) NOT NULL
);
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;
  }
}