我正在尝试使用 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> {
}
但是每次调用 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;
}
}
但是,如果我只是切换到长类型 ID 而不是用户名本身,那么一切都会正常。我认为使用字符串作为 id 是很常见的。那么如何实现这个工作呢?
我使用嵌入式hsql数据库。我没有写任何sql代码。
问题是
String username;
同时被注释为@Id
和@GeneratedValue
。 @Id
表示它应该是主键,也可以是字符串。但@GeneratedValue
表示您希望系统在创建新记录时自动生成新密钥。当主键是整数时,这很容易,所有数据库都有序列的概念(即使语法并不总是相同)。但如果您希望 String 自动生成键,则必须定义自己的自定义生成器。
或者,如果您没有理由使用
@GeneratedValue
注释,只需按照 Bohuslav Burghardt 的建议将其删除
我遇到了同样的问题,即使当我删除了 @GenerateValue 并只保留 @Id 时,它仍然在创建数据库时给我带来了问题,(顺便说一下,我正在使用 wamp 服务器),我找到的解决方案是修复数据库中我的 id 列的列大小...希望我的评论有一天能帮助别人,并为我糟糕的英语感到抱歉!
通过放置可为空的 False 来使用如下所示的列注释。
@Id
@GeneratedValue
@Column(name = "username", nullable = false)
private String username;