spring 为什么不能用string作为id

ljsrvy3e  于 12个月前  发布在  Spring
关注(0)|答案(4)|浏览(127)

我正在尝试使用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代码。

3gtaxfhh

3gtaxfhh1#

问题是String username;同时用@Id@GeneratedValue注解。@Id意味着它应该是一个主键,它可以是一个String。但是@GeneratedValue意味着当你创建一个新记录时,你希望系统自动生成一个新键。当主键是整数时,这很容易,所有的数据库都有序列的概念(即使语法并不总是相同)。2但是如果你想要String自动生成键,你必须定义自己的自定义生成器。
或者,如果您没有理由使用@GeneratedValue注解,那么只需按照Bohuslav Burghardt的建议删除它即可

9jyewag0

9jyewag02#

我也遇到了同样的问题,即使我删除了@GeneratedValue,只保留了@Id,它仍然在创建数据库时给我带来了问题(顺便说一下,我正在使用WAMP服务器)。
我找到的解决方案是修复数据库中id列的列大小

zu0ti5jz

zu0ti5jz3#

检查你是否使用了import org.springframework.data.annotation.Id;和CrudRepository<X,String>

4dc9hkyq

4dc9hkyq4#

使用如下列注解,将nullable设置为False。

@Id
@GeneratedValue
@Column(name = "username", nullable = false)
private String username;

字符串

相关问题