Java 自动增量Id PostgreSQL和Spring引导数据JPA
我在PostgreSQL数据库中创建新记录时遇到问题。我只想向REST服务发布一个新用户(int:id,String:email,String:password),但出现以下错误: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
"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;
}
}