为什么我不能使用 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);
}

我的用于创建用户表的sql

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)

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

解决方法

我认为 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