我正在尝试使用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而不是用户名本身,那么一切正常。我认为使用string作为id是很常见的。那么如何使这项工作?
我使用嵌入式hsql数据库。我没有写任何sql代码。
答案 0 :(得分:5)
问题是String username;
注释了@Id
和@GeneratedValue
。 @Id
表示应该是主键,可以是String。但@GeneratedValue
表示您希望系统在创建新记录时自动生成新密钥。当主键是整数时,这很容易,所有数据库都有一个序列概念(即使语法并不总是相同)。但是如果你想要String自动生成的键,你就可以定义自己的自定义生成器。
或者,如果您没有理由进行@GeneratedValue
注释,只需按照Bohuslav Burghardt的建议将其删除
答案 1 :(得分:0)
通过放置可为空的 False 来使用如下所示的列注释。
@Id
@GeneratedValue
@Column(name = "username", nullable = false)
private String username;