Wildfly30+Java21环境下如何在部署时自动生成数据库Schema?
解决方案
1. 修正Persistence XML的命名空间与版本
WildFly 30 基于 Jakarta EE 10,对应 JPA 3.1 规范,你的配置仍使用旧的 Java EE 命名空间(java.sun.com),这会导致兼容性问题。替换为 Jakarta 规范的命名空间:
<persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_1.xsd" version="3.1">
2. 移除冲突的配置属性
你同时配置了 Hibernate 传统的 hibernate.hbm2ddl.auto 和 Jakarta 标准的 schema-generation 属性,两者会互相干扰。保留 Jakarta 标准属性即可,删除以下行:
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
3. 调整方言配置
MariaDB 对应的 Hibernate 6.x 方言应使用 org.hibernate.dialect.MariaDBDialect,而非旧的 MySQLDialect,替换方言属性:
<property name="hibernate.dialect" value="org.hibernate.dialect.MariaDBDialect" />
4. 确保文件路径权限
WildFly 进程需要对 /home/lapin/database-scripts/ 目录拥有读写权限。可以通过以下命令修改权限:
sudo mkdir -p /home/lapin/database-scripts sudo chown -R wildfly:wildfly /home/lapin/database-scripts sudo chmod -R 755 /home/lapin/database-scripts
(注:wildfly 是 WildFly 默认运行用户组,若你的环境使用不同用户,替换为实际运行用户)
5. 验证数据源配置
确认 java:jboss/MariaDBDS 数据源已在 WildFly 的 standalone.xml/domain.xml 中正确配置,且连接的 MariaDB 用户拥有 CREATE、DROP 数据库对象的权限。
最终修正后的persistence.xml
<persistence xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_1.xsd" version="3.1"> <persistence-unit name="MyPU"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <jta-data-source>java:jboss/MariaDBDS</jta-data-source> <shared-cache-mode>ALL</shared-cache-mode> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MariaDBDialect" /> <property name="hibernate.format_sql" value="true" /> <property name="jakarta.persistence.schema-generation.database.action" value="drop-and-create" /> <property name="jakarta.persistence.schema-generation.scripts.action" value="drop-and-create"/> <property name="jakarta.persistence.schema-generation.create-database-schemas" value="true"/> <property name="jakarta.persistence.schema-generation.scripts.create-target" value="/home/lapin/database-scripts/create.sql"/> <property name="jakarta.persistence.schema-generation.scripts.drop-target" value="/home/lapin/database-scripts/drop.sql"/> </properties> </persistence-unit> </persistence>
额外检查点
- 确保所有实体类都被持久化单元识别:若实体类不在当前模块默认包下,需添加
<class>标签显式声明。 - 查看 WildFly 服务器日志(
standalone/log/server.log),若仍未生成,检查是否存在数据源连接失败、权限不足或实体类注解错误的异常信息。
内容的提问来源于stack exchange,提问作者lapin
相关产品推荐
相关产品推荐

