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

Ebean ORM无法在本地MySQL自动生成players表问题求助

问题解决步骤

1. 补充缺失的ebean-ddl-generator依赖

报错核心原因是Ebean的DDL自动生成功能依赖独立的ebean-ddl-generator模块,你的项目未引入该依赖,导致无法生成表结构。

根据你使用的Ebean 15.1.1版本,在构建文件中添加对应依赖:

Maven(pom.xml)

<dependency>
    <groupId>io.ebean</groupId>
    <artifactId>ebean-ddl-generator</artifactId>
    <version>15.1.1</version>
    <scope>runtime</scope>
</dependency>

Gradle(build.gradle)

runtimeOnly 'io.ebean:ebean-ddl-generator:15.1.1'

2. 修复数据库初始化代码的重复创建问题

你的代码中连续调用了DatabaseFactory.createWithContextClassLoader和DatabaseFactory.create,导致数据库初始化重复,可能跳过DDL执行逻辑。修改后的初始化代码如下:

private Database createDatabase() {
    ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
    ClassLoader pluginClassLoader = PlayLegendBewerbung.class.getClassLoader();
    try {
        Thread.currentThread().setContextClassLoader(pluginClassLoader);
        io.ebean.config.DatabaseConfig serverConfig = new io.ebean.config.DatabaseConfig();
        serverConfig.setName("db");
        serverConfig.loadFromProperties();
        // 启用DDL生成与执行
        serverConfig.setDdlGenerate(true);
        serverConfig.setDdlRun(true);
        serverConfig.setDefaultServer(true);
        serverConfig.setRegister(true);

        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUsername("root");
        dataSourceConfig.setPassword("");
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/database");
        dataSourceConfig.setDriver("com.mysql.cj.jdbc.Driver");
        serverConfig.setDataSourceConfig(dataSourceConfig);

        // 手动注册实体类(关键:告诉Ebean要生成哪些表)
        serverConfig.addEntity(DatabasePlayer.class);
        // 如果存在Rank实体类,必须同步注册
        // serverConfig.addEntity(Rank.class);

        // 仅调用一次带类加载器的初始化方法
        database = DatabaseFactory.createWithContextClassLoader(serverConfig, pluginClassLoader);
        this.getLogger().info("Successfully created database");
    } catch (Exception e) {
        this.getLogger().severe("Error creating database: " + e.getMessage());
        e.printStackTrace();
    } finally {
        Thread.currentThread().setContextClassLoader(originalClassLoader);
    }
    return database;
}

3. 确保实体类被正确识别

  • DatabasePlayer的@Entity和@Table注解配置正确,但必须通过serverConfig.addEntity()手动注册,否则Ebean无法识别该实体并生成对应表。
  • 由于DatabasePlayer关联了Rank实体,若Rank类同样是Ebean实体,必须同步注册,否则会因找不到关联实体报错。

4. 验证配置与环境一致性

  • 配置文件中的DDL开关与代码中的设置兼容,无需修改,但要确保MySQL中的database库已提前创建(Ebean仅生成表,不会自动创建数据库)。
  • 检查MySQL服务是否正常运行,root账号拥有创建表的权限。
  • 确认JDBC驱动版本与MySQL版本匹配:com.mysql.cj.jdbc.Driver适用于MySQL 8.0+,旧版本MySQL需改用com.mysql.jdbc.Driver。

内容的提问来源于stack exchange,提问作者Carina Sophie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:05:54