为什么我不能使用字符串作为ID

dar*_*ord 3 spring spring-data spring-data-jpa

我正在尝试使用CrudRepository创建用户模型:

    @Entity
    public class User {
        @Id
        @GeneratedValue
        private String username;
        private String password;

        public String getPassword() {
            return password;
        }

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

        public String getUsername() {
            return username;
        }

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

    public interface UserRepository extends CrudRepository<User, String> {

    }
Run Code Online (Sandbox Code Playgroud)

但是,每次调用findOne()时,都会出现500错误:

@Controller
public class UserController {
    @Autowired
    private UserRepository users;

    @Override
    @RequestMapping(value="/register", method=RequestMethod.POST)
    public @ResponseBody User register(@RequestBody User userToRegister) {
        String username = userToRegister.getUsername();
        User user = users.findOne(id);
        if (user != null) {
            return null;
        }
        User registeredUser = users.save(userToRegister);
        return registeredUser;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我只是切换到长类型ID而不是用户名本身,则一切正常。我认为使用字符串作为id是很常见的。那么如何使这项工作呢?

我使用嵌入式hsql数据库。我没有写任何SQL代码。

Ser*_*sta 5

问题是String username;@Id和都注释了@GeneratedValue@Id表示应该是主键,可以是String。但是,这@GeneratedValue意味着您希望系统在创建新记录时自动生成新密钥。当主键是整数,所有数据库都有顺序的概念时,这很容易(即使语法并不总是相同的)。但是,如果您希望String自动生成键,则必须定义自己的自定义生成器。

或者,如果您没有理由添加@GeneratedValue注释,只需按照Bohuslav Burghardt的建议将其删除