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
相关产品推荐
相关产品推荐

