You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot使用String作为JPA主键时entityManagerFactory创建错误如何解决

问题解决方法

根本原因

报错提示No identifier specified for entity是因为你用于继承的抽象父类AbstractEntity没有添加JPA的@MappedSuperclass注解,默认情况下JPA不会将父类的字段映射规则继承给子类,因此Hibernate识别不到User、Wander实体上的主键定义。

修复步骤

  1. 修改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;
    }

}
  1. 额外优化建议(避免后续出现业务问题):
  • 当前你把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:18:02