我正在尝试使用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,而不是username本身,那么一切都工作。我认为这是常见的使用字符串作为id。那么如何使这工作?
我使用的是嵌入式hsql数据库,我没有写任何sql代码。
4条答案
按热度按时间3gtaxfhh1#
问题是
String username;
同时用@Id
和@GeneratedValue
注解。@Id
意味着它应该是一个主键,它可以是一个String。但是@GeneratedValue
意味着当你创建一个新记录时,你希望系统自动生成一个新键。当主键是整数时,这很容易,所有的数据库都有序列的概念(即使语法并不总是相同)。2但是如果你想要String自动生成键,你必须定义自己的自定义生成器。或者,如果您没有理由使用
@GeneratedValue
注解,那么只需按照Bohuslav Burghardt的建议删除它即可9jyewag02#
我也遇到了同样的问题,即使我删除了@GeneratedValue,只保留了@Id,它仍然在创建数据库时给我带来了问题(顺便说一下,我正在使用WAMP服务器)。
我找到的解决方案是修复数据库中id列的列大小
zu0ti5jz3#
检查你是否使用了import org.springframework.data.annotation.Id;和CrudRepository<X,String>
4dc9hkyq4#
使用如下列注解,将nullable设置为False。
字符串