Spring Boot操作Oracle时Hibernate报‘no identifier specified’错误咨询
解决Hibernate的“No identifier specified for entity”错误
嘿,我一眼就揪出了导致这个报错的核心问题——你用错了@Id注解的包!下面一步步给你讲清楚怎么修复:
1. 替换错误的@Id注解包
你现在导入的是org.springframework.data.annotation.Id,这个注解是给Spring Data的非关系型数据库(比如MongoDB、Redis)用的。而Hibernate作为JPA的实现,只认JPA规范里的@Id注解。
修改实体类的@Id导入:
把:
import org.springframework.data.annotation.Id;
换成对应版本的JPA注解:
// Spring Boot 2.x及以下版本(Java EE规范) import javax.persistence.Id; // Spring Boot 3.x及以上版本(Jakarta EE规范) import jakarta.persistence.Id;
2. 修正Repository的泛型类型
你的user_id字段是Long类型,但Repository里写的是JpaRepository<hindalco_model,Integer>,这会导致后续保存操作出现类型不匹配问题,赶紧改成:
public interface hindalco_repository extends JpaRepository<hindalco_model, Long> { }
3. 适配Oracle的自增策略(可选但更规范)
你已经用序列和触发器实现了自增,其实可以把GenerationType.IDENTITY换成更适配Oracle的SEQUENCE策略,避免潜在的兼容性问题:
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_seq") @SequenceGenerator(name = "user_id_seq", sequenceName = "user_id", allocationSize = 1) @Column(name="user_id", updatable=false, nullable=false) private Long user_id;
这里sequenceName要和你创建的序列名保持一致(你的触发器里用的是user_id.nextval,所以序列名就是user_id)。
额外的最佳实践建议(非报错原因,但提升代码质量)
- Java类名遵循大驼峰规范:把
hindalco_model改成HindalcoModel - 变量名用小驼峰:
user_id改成userId,同时保留@Column(name="user_id")来映射数据库字段即可
修改后的完整实体类示例
package com.sid.demo.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.SequenceGenerator; import javax.persistence.Table; @Table(name="user_registration") @Entity public class HindalcoModel { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_id_seq") @SequenceGenerator(name = "user_id_seq", sequenceName = "user_id", allocationSize = 1) @Column(name="user_id", updatable=false, nullable=false) private Long userId; @Column(name="user_name") private String userName; @Column(name="email") private String email; @Column(name="password") private String password; // getter、setter及toString方法省略 }
为什么会出现这个错误?
Hibernate在初始化实体管理器时,会扫描所有标注@Entity的类,寻找JPA规范定义的@Id注解来识别主键。你用了Spring Data的@Id,Hibernate完全识别不了,所以就抛出了“No identifier specified for entity”的异常。
内容的提问来源于stack exchange,提问作者SAMUEL BARKLEY
相关产品推荐
相关产品推荐

