Hibernate 中出现表名(XXX) is not mapped 问题

本文记录了一个使用Hibernate进行简单登录查询时遇到的问题及解决过程。主要问题是由于HQL语句中表名使用错误导致的“users is not mapped”错误。文中详细介绍了如何定位问题并给出了正确的HQL语句。
今天晚上自己试着用Hibernate去搭建一个Web工程,然后去实现一个简单的登录。
通过Hibernate?做查询操作的时候总是报出这样的错:
users is?not?mapped.
 于是乎去检查了下映射,发现没问题呀,反复验证结果还是一样报错。
User.hbm.xml:
<class name="com.lian.bean.User" table="users">
hibernate.cfg.xml:
<mapping resource="com/lian/bean/User.hbm.xml" />
在网上找了很多,但还是不给力,大家都没提些有建设性的解决方案,基本上都是说配置有问题。
不过自己感觉是这个出问题:
String sql = "select u.password from users u where u.username='" +user.getUsername()+ "'";
经过多番纠结和耐心查找资料,发现:
原来 HQL语句中表名应该是ORM映射的类名,所以应该改成:
String sql = "select u.password from User u where u.username='" +user.getUsername()+ "'";
sql 语句查找的是生成的User 类,不是普通的表。 。。。。
Hibernate 中出现 `QueryException: entity is not mapped` 错误通常Hibernate 无法找到与查询中指定实体相关的映射信息。以下是导致此问题的常见原因以及对应的解决方案。 ### 1. 实体类未正确注册或映射 Hibernate 需要知道哪些类是实体类,并且需要相应的映射信息(例如通过注解或 XML 文件定义)。如果实体类没有被正确注册,Hibernate 将无法识别该类。 - **解决方案**: 确保实体类使用了 `@Entity` 注解,并且在配置中指定了包含实体类的包路径。例如: ```java @Entity public class User { @Id private Long id; // 其他字段和方法 } ``` 在 Hibernate 配置中,可以通过以下方式指定包路径以扫描实体类: ```java configuration.setPackagesToScan(new String[] {"com.example.entities"}); ``` 如果使用的是 Spring Boot,则确保在主应用类中使用了 `@EntityScan` 注解来指定实体类所在的包: ```java @SpringBootApplication @EntityScan("com.example.entities") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` ### 2. 查询中使用的实体称不正确 在 HQL 查询中,如果实体称拼写错误或使用了错误的称,也会导致此问题Hibernate 使用实体称(默认是类)来查找映射信息。 - **解决方案**: 检查查询语句中的实体称是否与实体类一致。例如,以下查询是正确的,前提是 `User` 是一个已映射的实体类: ```java String hql = "FROM User WHERE id = 1"; Query query = session.createQuery(hql); ``` 如果实体类使用了 `@Entity(name = "CustomName")` 注解,则需要在查询中使用指定的称: ```java @Entity(name = "CustomName") public class User { // 字段和方法 } ``` 对应的查询应为: ```java String hql = "FROM CustomName WHERE id = 1"; ``` ### 3. 未正确加载实体类的映射文件 如果使用 XML 文件定义映射信息,但未正确加载这些文件,Hibernate 将无法找到实体类的映射信息。 - **解决方案**: 确保在 Hibernate 配置中加载了实体类的映射文件。例如: ```java configuration.addAnnotatedClass(com.example.entities.User.class); ``` 或者,如果使用的是 XML 映射文件,则需要通过以下方式加载: ```java configuration.addResource("com/example/entities/User.hbm.xml"); ``` ### 4. 多模块项目中的实体类未正确配置 在多模块项目中,如果实体类位于另一个模块中且未正确配置,Hibernate 可能无法找到实体类的映射信息。 - **解决方案**: 确保实体类所在的模块已被正确依赖,并且 Hibernate 配置中包含了实体类所在的包路径。 ### 5. Hibernate 配置问题 Hibernate 的配置文件(如 `hibernate.cfg.xml` 或 `persistence.xml`)可能存在错误,导致实体类未被正确加载。 - **解决方案**: 检查 Hibernate 配置文件,确保所有相关设置(如数据库连接、实体类扫描路径等)均正确无误。例如,在 `hibernate.cfg.xml` 中,确保包含了以下配置: ```xml <property name="hibernate.packages.to.scan">com.example.entities</property> ``` ### 6. 缓存或构建问题 在某些情况下,旧的缓存或构建文件可能导致 Hibernate 无法识别最新的实体类映射信息。 - **解决方案**: 清理项目并重新构建,确保所有实体类和映射文件均为最新版本。对于 Maven 项目,可以使用以下命令清理和重新构建: ```bash mvn clean install ``` 对于 Gradle 项目,可以使用以下命令: ```bash gradle clean build ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值