为什么我用Spring数据Jdbc插入一个entity两次都不行?

Why can’t I insert an entity twice by using Spring Data Jdbc?

我的实体:

@Table("user")
public class User {

    @Id
    private Long user_id;
    private String username;
    private String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public User() {
    }

    public Long getUser_id() {
        return user_id;
    }

    public void setUser_id(Long user_id) {
        this.user_id = user_id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

我的存储库:

public interface UserRepository extends CrudRepository<User, Long> {

    @Query("select * from user where username = :username")
    User findByUsername(@Param("username") String username);
}

my sql 用于创建用户 table:

CREATE TABLE `user` (
  `user_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL,
  `password` text NOT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `UINQUE_USERNAME`(`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
User userForRegister = new User(username, passwordEncoder.encode(password));
userRepository.save(userForRegister)

如果我执行'userRepository.save(userForRegister)'这行,我会第一次插入实体成功。

但是,如果我想插入另一个具有不同用户名的用户实体,我会得到一个错误:

2021-01-08 21:37:38.242  INFO 11180 --- [nio-8080-exec-8] c.k.centre.controller.UserController     : Failed to execute DbAction.InsertRoot(entity=com.***.***.Entity.User@65bc9ea1, generatedId=null)

我可以插入它,直到删除用户table的所有数据。 有没有漏掉的地方?

我认为 GenerateValue 可以解决问题

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long user_id;

此外,我认为您应该使用 @Column 注释将您的字段映射到数据库列

@Column(name = "user_id")
private Long user_id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;

尝试将 @GeneratedValue(strategy = GenerationType.IDENTITY) 添加到您的 user_id。这告诉 Hibernate id 是由你的数据库生成的。您将数据库主键配置为自动增量列。也看看 here.