Spring Boot JPA出现@OneToMany targeting an unmapped class报错如何解决
问题根因
报错日志中明确提示Use of @OneToMany or @ManyToMany targeting an unmapped class,核心原因是Role类未被标注为JPA实体类,Hibernate无法识别它为可映射的数据库表类,同时还存在部分JPA规范要求的配置缺失。
修复步骤
步骤1:修复Role类的实体配置
给Role类添加@Entity注解,补全属性的getter/setter方法、修改无参构造为public(JPA强制要求实体类有public的无参构造方法),修改后代码如下:
package com.example.soasec.entities; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; // 新增JPA实体注解 @Entity public class Role { @Id @GeneratedValue private Long id; String name; // 无参构造改为public public Role(){} public Role(String name) {this.name=name;} // 补全id、name的getter和setter public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName(){return name; } public void setName(String name) {this.name= name; } }
步骤2:优化User类的关联配置(可选但推荐)
实际业务中用户和角色是多对多关系:一个用户可以绑定多个角色,一个角色可以分配给多个用户,因此更推荐使用@ManyToMany替换@OneToMany,同时补全缺失的active属性的getter/setter:
package com.example.soasec.entities; import javax.persistence.*; import java.util.List; @Entity public class User extends BaseEntity{ private String username; private String password; // 替换为多对多注解,配置关联中间表 @ManyToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL) @JoinTable( name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id") ) private List<Role> roles; private boolean active; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public List<Role> getRoles() { return roles; } public void setRoles(List<Role> roles) { this.roles = roles; } // 补全active属性的getter/setter public boolean isActive() { return active; } public void setActive(boolean active) { this.active = active; } }
步骤3:验证扫描配置
确认项目启动类的包位置在com.example.soasec根目录下,默认会自动扫描子包中的实体类;如果启动类不在根目录,需要在启动类上添加@EntityScan("com.example.soasec.entities")注解,确保所有实体类被Spring识别。
内容的提问来源于stack exchange,提问作者Jhon
相关产品推荐
相关产品推荐

