WildFly+Hibernate报错:Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
解决方案
1. 修复persistence.xml结构缺失问题
你的persistence.xml缺少JPA规范要求的根标签和命名空间,完整的配置文件应该是:
<?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_2.xsd" version="2.2"> <persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> <class>entity.LeadsEntity</class> <properties> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/zadatakdb?useSSL=false&serverTimezone=UTC"/> <property name="hibernate.connection.driver_class" value="com.mysql.cj.jdbc.Driver"/> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="root"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence>
- 补充了完整的根标签与命名空间,这是JPA加载配置的必要前提
- 替换废弃的
com.mysql.jdbc.Driver为新版驱动com.mysql.cj.jdbc.Driver,适配MySQL 8+版本 - 更新方言为
MySQL8Dialect,避免兼容性问题 - 连接URL添加
useSSL=false和serverTimezone=UTC,解决时区与SSL连接报错 - 新增
hibernate.hbm2ddl.auto=update,自动同步实体类与数据库表结构
2. 修正实体类主键生成冲突
你的LeadsEntity中leadId使用了IDENTITY自增策略,但代码中手动设置了主键值,这会导致自增逻辑冲突。修改方式:
- 移除代码中的
leadsEntity.setLeadId(5);,让数据库自动生成主键 - 若需手动指定主键,将生成策略改为
GenerationType.AUTO或移除@GeneratedValue注解
修正后的getLeads()方法:
@GET @Produces("text/plain") @Path("/test") public void getLeads() { EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("default"); EntityManager entityManager = entityManagerFactory.createEntityManager(); EntityTransaction transaction = entityManager.getTransaction(); try{ transaction.begin(); LeadsEntity leadsEntity = new LeadsEntity(); // 移除手动设置主键的代码,依赖数据库自增 leadsEntity.setFirstName("Test"); leadsEntity.setLastName("Tester"); leadsEntity.setAddress("Test street 2"); leadsEntity.setAge(33); entityManager.persist(leadsEntity); transaction.commit(); }finally { if(transaction.isActive()){ transaction.rollback(); } entityManager.close(); entityManagerFactory.close(); } }
3. 确认MySQL驱动依赖配置
确保项目中引入了适配版本的MySQL驱动,Maven依赖示例:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> <scope>provided</scope> </dependency>
若为WildFly部署,需将驱动包放置到WildFly_HOME/modules/system/layers/base/com/mysql/main目录,并配置module.xml,确保服务器能正确加载驱动。
4. 验证数据库连接可用性
- 确认MySQL服务正常运行,端口3306可访问
- 用MySQL客户端测试
root/root账号能否连接zadatakdb数据库 - 确保
zadatakdb中leads表存在,字段结构与实体类一致
内容的提问来源于stack exchange,提问作者lino_dev
相关产品推荐
相关产品推荐

