You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:06:17