Java EE7项目API调用报SQLGrammarException、H2表不存在问题求助
问题根因解释
1. 为什么用JPQL却出现Hibernate相关报错
JPQL是JPA规范定义的查询语言,本身只是一套接口标准,需要具体实现才能运行。你使用的Java EE 7应用服务器(比如WildFly、GlassFish、Payara等)默认内置了Hibernate作为JPA的官方实现,即使你没有主动在项目中引入Hibernate依赖,服务器运行时也会自动用内置的Hibernate来处理你的JPQL查询、做ORM映射,所以报错中出现Hibernate相关的异常类是正常现象,和你的代码选型不冲突。
2. 为什么没有配置H2却连接到H2数据库
你的persistence.xml配置存在不兼容问题,导致应用服务器没有读取到你写的MySQL连接配置,自动启用了服务器内置的默认数据源,绝大多数Java EE服务器的默认内置数据源就是H2内存数据库,所以才会出现H2相关的报错,在H2数据库里自然找不到你在MySQL中建的APARTMENTS表。
配置不兼容的核心问题在于:你开发的是Java EE 7项目,对应使用的是JPA 2.1规范,命名空间是http://xmlns.jcp.org/xml/ns/persistence,但你现在的persistence.xml用的是Jakarta Persistence 3.0的命名空间,Jakarta EE 9及以上版本才会识别这个命名空间,Java EE 7服务器根本识别不了这套配置,相当于你的数据库配置完全没生效。
修复步骤
- 第一步:修正
persistence.xml的命名空间和版本号,适配Java EE 7的JPA 2.1规范,修正后的配置示例如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1"> <persistence-unit name="rentRantPU" transaction-type="JTA"> <class>com.rentRant.rentRant.model.Apartment</class> <class>com.rentRant.rentRant.model.User</class> <class>com.rentRant.rentRant.model.Review</class> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/rentRant?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8"/> <property name="javax.persistence.jdbc.user" value="root"/> <property name="javax.persistence.jdbc.password" value="你的MySQL密码"/> <!-- 可选配置:打印生成的SQL,方便后续排查问题 --> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> </properties> </persistence-unit> </persistence>
- 第二步:确认你的项目中已经引入了MySQL JDBC驱动依赖,如果是Maven项目,在pom.xml中加入如下配置:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency>
- 第三步:确认你MySQL的
rentRant库中已经创建了apartments表,表字段和你的Apartment实体类的属性映射一致。 - 第四步:重新打包部署项目,再调用接口测试即可。
额外说明
你写的findAll方法的JPQL语法没有问题,不需要修改。
内容的提问来源于stack exchange,提问作者user16176270
相关产品推荐
相关产品推荐

