Spring Boot使用String作为JPA主键时entityManagerFactory创建错误如何解决
问题解决方法
根本原因
报错提示No identifier specified for entity是因为你用于继承的抽象父类AbstractEntity没有添加JPA的@MappedSuperclass注解,默认情况下JPA不会将父类的字段映射规则继承给子类,因此Hibernate识别不到User、Wander实体上的主键定义。
修复步骤
- 修改
AbstractEntity.java,添加@MappedSuperclass注解,修改后的代码如下:
package com.hashir.smartcity.entities; import javax.persistence.Id; import javax.persistence.MappedSuperclass; @MappedSuperclass public class AbstractEntity { @Id private String location; public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } }
- 额外优化建议(避免后续出现业务问题):
- 当前你把
location作为所有实体的主键,对于User实体来说完全不合理,多个用户可以是同一个位置,会触发主键冲突导致用户保存失败。建议单独给User类加独立主键,比如用自增id或者用唯一的email作为主键。 - 登录逻辑没有做非空判断,如果用户输入不存在的邮箱,
userRepository.findByEmail(email)会返回null,调用getPassword()会触发空指针异常,建议修改为:
@RequestMapping(value="/login",method=RequestMethod.POST) public String login(@RequestParam("email")String email,@RequestParam("password")String password,ModelMap modelMap) { User user = userRepository.findByEmail(email); if(user != null && user.getPassword().equals(password)) { return "/enterLocation"; } modelMap.addAttribute("msg", "用户名或密码错误,请重试"); return "login/login"; }
- 密码明文存储存在安全风险,后续可以引入Spring Security的BCrypt加密方案存储密文密码。
内容的提问来源于stack exchange,提问作者Mohammad Hashir
相关产品推荐
相关产品推荐

