为什么我不能使用字符串作为 id
why I can't use string as id
我正在尝试使用 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
的意思是你希望系统在你新建一条记录的时候自动生成一个新的key。当主键是整数时,这很容易,所有数据库都有序列的概念(即使语法并不总是相同的)。但是,如果您希望 String 自动生成键,则必须定义自己的自定义生成器。
或者,如果您没有理由使用 @GeneratedValue
注释,只需按照 Bohuslav Burghardt
的建议将其删除
通过设置可为空的 False 来使用如下所示的列注释。
@Id
@GeneratedValue
@Column(name = "username", nullable = false)
private String username;
我正在尝试使用 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
的意思是你希望系统在你新建一条记录的时候自动生成一个新的key。当主键是整数时,这很容易,所有数据库都有序列的概念(即使语法并不总是相同的)。但是,如果您希望 String 自动生成键,则必须定义自己的自定义生成器。
或者,如果您没有理由使用 @GeneratedValue
注释,只需按照 Bohuslav Burghardt
通过设置可为空的 False 来使用如下所示的列注释。
@Id
@GeneratedValue
@Column(name = "username", nullable = false)
private String username;