【问题标题】:AutoIncrement Id PostgreSQL and Spring Boot Data JPAAutoIncrement Id PostgreSQL 和 Spring Boot Data JPA
【发布时间】:2017-06-07 02:29:58
【问题描述】:

我在尝试在 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;
  }
}

服务

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

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

【问题讨论】:

    标签: java spring postgresql jpa


    【解决方案1】:

    我找到了解决方案。我需要更改这些脚本:

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

    【讨论】:

    • 这可能不适用于您的项目,但您应该知道使用数据库生成的 id 会影响性能。当 ID 由数据库生成时,JPA 必须在每次插入后使用附加查询将 id 加载到持久性上下文中。除了使语句数翻倍之外,还阻碍了批量插入优化。
    • @KlausGroenbaek 好吧,我对数据库和性能了解不多。那么,我应该怎么做才能替换数据库中自动生成的 id?
    • 你可能不需要做任何事情,除非你在每个事务中插入很多行,如果你这样做,你应该看看@TableGenerator这里wiki.eclipse.org/EclipseLink/UserGuide/JPA/…
    • 您不需要创建表脚本 - 这些表是由 JPA 自动生成的。
    【解决方案2】:

    SQL应该是这样的..

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

    【讨论】:

    • 让我试试那个脚本
    • 感谢您的帮助,无论如何。
    • PostgreSQL 的数据类型有 smallserial、serial 和 bigserial。
    猜你喜欢
    • 2017-11-29
    • 2018-09-17
    • 2019-07-14
    • 2017-05-09
    • 2016-06-26
    • 2018-08-06
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多