I’m developing a Minecraft PaperMC plugin using Ebean ORM (v15.1.1) with a MySQL database and IntelliJ for development. However, I keep encountering the following error:
What I’m trying to achieve:
I’m attempting to create a table called players automatically when the plugin is enabled. The table should have columns for a player’s UUID, rank, expiry date, etc. The table creation should happen via Ebean’s DDL generation.
What I’ve tried so far:
The exception:
<code> [12:58:58 ERROR]: [io.ebean.core] Configured to run DDL but ebean-ddl-generator is not in the classpath (or ebean-test in the test classpath?)
[12:58:58 INFO]: [io.ebean.core] Started database[db] platform[MYSQL55] in 4ms
[12:58:58 INFO]: [PlayLegendBewerbung] Successfully created database
[12:58:58 ERROR]: Error occurred while enabling PlayLegendBewerbung v1.0-SNAPSHOT (Is it up to date?)
jakarta.persistence.PersistenceException: Error: Table 'database.players' doesn't exist
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebean.config.dbplatform.SqlCodeTranslator.translate(SqlCodeTranslator.java:85) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebean.config.dbplatform.DatabasePlatform.translate(DatabasePlatform.java:212) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:77) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.DmlBeanPersister.insert(DmlBeanPersister.java:46) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.PersistRequestBean.executeInsert(PersistRequestBean.java:1064) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:624) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.PersistRequestBean.executeNoBatch(PersistRequestBean.java:668) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.PersistRequestBean.executeOrQueue(PersistRequestBean.java:659) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:284) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:234) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:215) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1503) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1495) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/com.carinaschoppe.playLegendBewerbung.database.PlayerDAO.savePlayer(PlayerDAO.java:29) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/com.carinaschoppe.playLegendBewerbung.PlayLegendBewerbung.doDatabaseStuff(PlayLegendBewerbung.java:55) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/com.carinaschoppe.playLegendBewerbung.PlayLegendBewerbung.onEnable(PlayLegendBewerbung.java:40) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:288) ~[paper-mojangapi-1.21.1-R0.1-SNAPSHOT.jar:?]
at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:202) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:109) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:520) ~[paper-mojangapi-1.21.1-R0.1-SNAPSHOT.jar:?]
at org.bukkit.craftbukkit.CraftServer.enablePlugin(CraftServer.java:640) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at org.bukkit.craftbukkit.CraftServer.enablePlugins(CraftServer.java:589) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:754) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:516) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:329) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1215) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:330) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at java.base/java.lang.Thread.run(Thread.java:1570) ~[?:?]
Caused by: java.sql.SQLSyntaxErrorException: Table 'database.players' doesn't exist
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:112) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:113) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:938) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1106) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1045) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1369) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1030) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebean.datasource.pool.ExtendedPreparedStatement.executeUpdate(ExtendedPreparedStatement.java:123) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.bind.DataBind.executeUpdate(DataBind.java:102) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.InsertHandler.execute(InsertHandler.java:105) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.DmlHandler.executeNoBatch(DmlHandler.java:88) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:69) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
... 25 more
[12:58:58 INFO]: [PlayLegendBewerbung] Disabling PlayLegendBewerbung v1.0-SNAPSHOT
[12:58:58 INFO]: [PlayLegendBewerbung] Plugin deaktiviert.
[12:58:58 INFO]: [spark] Starting background profiler...
Caused by: java.sql.SQLSyntaxErrorException: Table 'database.players' doesn't exist
</code>
<code> [12:58:58 ERROR]: [io.ebean.core] Configured to run DDL but ebean-ddl-generator is not in the classpath (or ebean-test in the test classpath?)
[12:58:58 INFO]: [io.ebean.core] Started database[db] platform[MYSQL55] in 4ms
[12:58:58 INFO]: [PlayLegendBewerbung] Successfully created database
[12:58:58 ERROR]: Error occurred while enabling PlayLegendBewerbung v1.0-SNAPSHOT (Is it up to date?)
jakarta.persistence.PersistenceException: Error: Table 'database.players' doesn't exist
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebean.config.dbplatform.SqlCodeTranslator.translate(SqlCodeTranslator.java:85) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebean.config.dbplatform.DatabasePlatform.translate(DatabasePlatform.java:212) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:77) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.DmlBeanPersister.insert(DmlBeanPersister.java:46) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.PersistRequestBean.executeInsert(PersistRequestBean.java:1064) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:624) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.PersistRequestBean.executeNoBatch(PersistRequestBean.java:668) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.PersistRequestBean.executeOrQueue(PersistRequestBean.java:659) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:284) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:234) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:215) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1503) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1495) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/com.carinaschoppe.playLegendBewerbung.database.PlayerDAO.savePlayer(PlayerDAO.java:29) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/com.carinaschoppe.playLegendBewerbung.PlayLegendBewerbung.doDatabaseStuff(PlayLegendBewerbung.java:55) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/com.carinaschoppe.playLegendBewerbung.PlayLegendBewerbung.onEnable(PlayLegendBewerbung.java:40) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:288) ~[paper-mojangapi-1.21.1-R0.1-SNAPSHOT.jar:?]
at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:202) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:109) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:520) ~[paper-mojangapi-1.21.1-R0.1-SNAPSHOT.jar:?]
at org.bukkit.craftbukkit.CraftServer.enablePlugin(CraftServer.java:640) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at org.bukkit.craftbukkit.CraftServer.enablePlugins(CraftServer.java:589) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:754) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:516) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:329) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1215) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:330) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at java.base/java.lang.Thread.run(Thread.java:1570) ~[?:?]
Caused by: java.sql.SQLSyntaxErrorException: Table 'database.players' doesn't exist
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:112) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:113) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:938) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1106) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1045) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1369) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1030) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebean.datasource.pool.ExtendedPreparedStatement.executeUpdate(ExtendedPreparedStatement.java:123) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.bind.DataBind.executeUpdate(DataBind.java:102) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.InsertHandler.execute(InsertHandler.java:105) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.DmlHandler.executeNoBatch(DmlHandler.java:88) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:69) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
... 25 more
[12:58:58 INFO]: [PlayLegendBewerbung] Disabling PlayLegendBewerbung v1.0-SNAPSHOT
[12:58:58 INFO]: [PlayLegendBewerbung] Plugin deaktiviert.
[12:58:58 INFO]: [spark] Starting background profiler...
Caused by: java.sql.SQLSyntaxErrorException: Table 'database.players' doesn't exist
</code>
[12:58:58 ERROR]: [io.ebean.core] Configured to run DDL but ebean-ddl-generator is not in the classpath (or ebean-test in the test classpath?)
[12:58:58 INFO]: [io.ebean.core] Started database[db] platform[MYSQL55] in 4ms
[12:58:58 INFO]: [PlayLegendBewerbung] Successfully created database
[12:58:58 ERROR]: Error occurred while enabling PlayLegendBewerbung v1.0-SNAPSHOT (Is it up to date?)
jakarta.persistence.PersistenceException: Error: Table 'database.players' doesn't exist
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebean.config.dbplatform.SqlCodeTranslator.translate(SqlCodeTranslator.java:85) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebean.config.dbplatform.DatabasePlatform.translate(DatabasePlatform.java:212) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:77) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.DmlBeanPersister.insert(DmlBeanPersister.java:46) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.PersistRequestBean.executeInsert(PersistRequestBean.java:1064) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:624) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.PersistRequestBean.executeNoBatch(PersistRequestBean.java:668) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.PersistRequestBean.executeOrQueue(PersistRequestBean.java:659) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:284) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.DefaultPersister.insert(DefaultPersister.java:234) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.DefaultPersister.save(DefaultPersister.java:215) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1503) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.core.DefaultServer.save(DefaultServer.java:1495) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/com.carinaschoppe.playLegendBewerbung.database.PlayerDAO.savePlayer(PlayerDAO.java:29) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/com.carinaschoppe.playLegendBewerbung.PlayLegendBewerbung.doDatabaseStuff(PlayLegendBewerbung.java:55) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/com.carinaschoppe.playLegendBewerbung.PlayLegendBewerbung.onEnable(PlayLegendBewerbung.java:40) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:288) ~[paper-mojangapi-1.21.1-R0.1-SNAPSHOT.jar:?]
at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:202) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:109) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:520) ~[paper-mojangapi-1.21.1-R0.1-SNAPSHOT.jar:?]
at org.bukkit.craftbukkit.CraftServer.enablePlugin(CraftServer.java:640) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at org.bukkit.craftbukkit.CraftServer.enablePlugins(CraftServer.java:589) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:754) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:516) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:329) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1215) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:330) ~[paper-1.21.1.jar:1.21.1-57-b483da4]
at java.base/java.lang.Thread.run(Thread.java:1570) ~[?:?]
Caused by: java.sql.SQLSyntaxErrorException: Table 'database.players' doesn't exist
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:112) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:113) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:938) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1106) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1045) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1369) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1030) ~[mysql-connector-j-8.4.0.jar:8.4.0]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebean.datasource.pool.ExtendedPreparedStatement.executeUpdate(ExtendedPreparedStatement.java:123) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.bind.DataBind.executeUpdate(DataBind.java:102) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.InsertHandler.execute(InsertHandler.java:105) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.DmlHandler.executeNoBatch(DmlHandler.java:88) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
at PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar/io.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:69) ~[PlayLegendBewerbung-1.0-SNAPSHOT-1725620316623.jar:?]
... 25 more
[12:58:58 INFO]: [PlayLegendBewerbung] Disabling PlayLegendBewerbung v1.0-SNAPSHOT
[12:58:58 INFO]: [PlayLegendBewerbung] Plugin deaktiviert.
[12:58:58 INFO]: [spark] Starting background profiler...
Caused by: java.sql.SQLSyntaxErrorException: Table 'database.players' doesn't exist
How I create my Database:
<code> private Database createDatabase() {
// Speichern des ursprünglichen ClassLoaders
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
ClassLoader pluginClassLoader = PlayLegendBewerbung.class.getClassLoader();
try {
// Setze den Plugin-ClassLoader als den aktuellen ContextClassLoader
Thread.currentThread().setContextClassLoader(pluginClassLoader);
// Erstelle die Ebean-Datenbank-Konfiguration
io.ebean.config.DatabaseConfig serverConfig = new io.ebean.config.DatabaseConfig();
serverConfig.setName("db");
serverConfig.loadFromProperties(); // Lädt Konfiguration aus application.yaml oder ebean.properties
serverConfig.setDdlGenerate(true); // Generiert die Tabellen-SQL-Anweisungen
serverConfig.setDdlRun(true); // Führe die DDL aus, um die Tabellen zu erstellen
serverConfig.setDefaultServer(true);
serverConfig.setRegister(true);
// Setze die Datenbankverbindung
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUsername("root"); // Setze falls erforderlich
dataSourceConfig.setPassword(""); // Setze falls erforderlich
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/database"); // SQLite-Dateipfad
dataSourceConfig.setDriver("com.mysql.cj.jdbc.Driver");
serverConfig.setDataSourceConfig(dataSourceConfig);
// Initialisiere alle Klassen, die mit Ebean verbunden sind
DatabasePlayer.init(); // Initialisiere die DatabasePlayer-Entität
PlayerDAO.init(); // Initialisiere die DAO für Player
// Erstelle die Datenbank mit dem Plugin-ClassLoader
DatabaseFactory.createWithContextClassLoader(serverConfig, pluginClassLoader);
database = DatabaseFactory.create(serverConfig);
// Logge die erfolgreiche Erstellung der Datenbank
this.getLogger().info("Successfully created database");
} catch (Exception e) {
this.getLogger().severe("Error creating database: " + e.getMessage());
e.printStackTrace();
} finally {
// Setze den originalen ClassLoader zurück, nachdem die Datenbank initialisiert wurde
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
return database;
}
</code>
<code> private Database createDatabase() {
// Speichern des ursprünglichen ClassLoaders
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
ClassLoader pluginClassLoader = PlayLegendBewerbung.class.getClassLoader();
try {
// Setze den Plugin-ClassLoader als den aktuellen ContextClassLoader
Thread.currentThread().setContextClassLoader(pluginClassLoader);
// Erstelle die Ebean-Datenbank-Konfiguration
io.ebean.config.DatabaseConfig serverConfig = new io.ebean.config.DatabaseConfig();
serverConfig.setName("db");
serverConfig.loadFromProperties(); // Lädt Konfiguration aus application.yaml oder ebean.properties
serverConfig.setDdlGenerate(true); // Generiert die Tabellen-SQL-Anweisungen
serverConfig.setDdlRun(true); // Führe die DDL aus, um die Tabellen zu erstellen
serverConfig.setDefaultServer(true);
serverConfig.setRegister(true);
// Setze die Datenbankverbindung
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUsername("root"); // Setze falls erforderlich
dataSourceConfig.setPassword(""); // Setze falls erforderlich
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/database"); // SQLite-Dateipfad
dataSourceConfig.setDriver("com.mysql.cj.jdbc.Driver");
serverConfig.setDataSourceConfig(dataSourceConfig);
// Initialisiere alle Klassen, die mit Ebean verbunden sind
DatabasePlayer.init(); // Initialisiere die DatabasePlayer-Entität
PlayerDAO.init(); // Initialisiere die DAO für Player
// Erstelle die Datenbank mit dem Plugin-ClassLoader
DatabaseFactory.createWithContextClassLoader(serverConfig, pluginClassLoader);
database = DatabaseFactory.create(serverConfig);
// Logge die erfolgreiche Erstellung der Datenbank
this.getLogger().info("Successfully created database");
} catch (Exception e) {
this.getLogger().severe("Error creating database: " + e.getMessage());
e.printStackTrace();
} finally {
// Setze den originalen ClassLoader zurück, nachdem die Datenbank initialisiert wurde
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
return database;
}
</code>
private Database createDatabase() {
// Speichern des ursprünglichen ClassLoaders
ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
ClassLoader pluginClassLoader = PlayLegendBewerbung.class.getClassLoader();
try {
// Setze den Plugin-ClassLoader als den aktuellen ContextClassLoader
Thread.currentThread().setContextClassLoader(pluginClassLoader);
// Erstelle die Ebean-Datenbank-Konfiguration
io.ebean.config.DatabaseConfig serverConfig = new io.ebean.config.DatabaseConfig();
serverConfig.setName("db");
serverConfig.loadFromProperties(); // Lädt Konfiguration aus application.yaml oder ebean.properties
serverConfig.setDdlGenerate(true); // Generiert die Tabellen-SQL-Anweisungen
serverConfig.setDdlRun(true); // Führe die DDL aus, um die Tabellen zu erstellen
serverConfig.setDefaultServer(true);
serverConfig.setRegister(true);
// Setze die Datenbankverbindung
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUsername("root"); // Setze falls erforderlich
dataSourceConfig.setPassword(""); // Setze falls erforderlich
dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/database"); // SQLite-Dateipfad
dataSourceConfig.setDriver("com.mysql.cj.jdbc.Driver");
serverConfig.setDataSourceConfig(dataSourceConfig);
// Initialisiere alle Klassen, die mit Ebean verbunden sind
DatabasePlayer.init(); // Initialisiere die DatabasePlayer-Entität
PlayerDAO.init(); // Initialisiere die DAO für Player
// Erstelle die Datenbank mit dem Plugin-ClassLoader
DatabaseFactory.createWithContextClassLoader(serverConfig, pluginClassLoader);
database = DatabaseFactory.create(serverConfig);
// Logge die erfolgreiche Erstellung der Datenbank
this.getLogger().info("Successfully created database");
} catch (Exception e) {
this.getLogger().severe("Error creating database: " + e.getMessage());
e.printStackTrace();
} finally {
// Setze den originalen ClassLoader zurück, nachdem die Datenbank initialisiert wurde
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
return database;
}
My Table Class:
<code> package com.carinaschoppe.playLegendBewerbung.database;
import io.ebean.Model;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
import java.util.UUID;
@Entity
@Table(name = "players")
@Getter
@Setter
public class DatabasePlayer extends Model {
@Id
@Column(name = "uuid", unique = true, nullable = false)
private UUID uuid;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "rank_name")
private Rank rank;
public static void init(){}
@Column(name = "rank_expiry")
private LocalDateTime rankExpiry;
@Column(name = "name")
private String name;
@Column(name = "permanent", nullable = false)
private boolean permanent;
}
package com.carinaschoppe.playLegendBewerbung.database;
import io.ebean.DB;
import io.ebean.Database;
import io.ebean.Query;
import io.ebean.annotation.Transactional;
import javax.inject.Singleton;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
@Singleton
public class PlayerDAO {
public static void init(){}
private final Database database;
public PlayerDAO(Database database) {
this.database = database;
}
/**
* Speichert oder aktualisiert einen Spieler in der Datenbank.
*
* @param databasePlayer Das zu speichernde Player-Objekt.
*/
@Transactional
public void savePlayer(DatabasePlayer databasePlayer) {
database.save(databasePlayer); // Automatisch speichern oder aktualisieren
}
/**
* Holt einen Spieler anhand seiner UUID aus der Datenbank.
*
* @param uuid Die UUID des Spielers.
* @return Der Spieler mit der angegebenen UUID oder null, falls nicht gefunden.
*/
@Transactional
public Optional<DatabasePlayer> getPlayerByUUID(UUID uuid) {
return Optional.ofNullable(database.find(DatabasePlayer.class, uuid));
}
/**
* Holt alle Spieler aus der Datenbank.
*
* @return Eine Liste aller Spieler.
*/
@Transactional
public List<DatabasePlayer> getAllPlayers() {
// Erstellen einer Ebean-Abfrage, um alle Spieler abzurufen
Query<DatabasePlayer> query = database.find(DatabasePlayer.class);
// Abfrage ausführen und Liste der Spieler zurückgeben
return query.findList();
}
public List<DatabasePlayer> findPlayersByName(String name) {
Query<DatabasePlayer> query = database.find(DatabasePlayer.class).where().eq("name", name).query();
return query.findList();
}
public void updatePlayer(DatabasePlayer player) {
database.update(player);
}
// Spieler löschen
public void deletePlayer(DatabasePlayer player) {
database.delete(player);
}
}
</code>
<code> package com.carinaschoppe.playLegendBewerbung.database;
import io.ebean.Model;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
import java.util.UUID;
@Entity
@Table(name = "players")
@Getter
@Setter
public class DatabasePlayer extends Model {
@Id
@Column(name = "uuid", unique = true, nullable = false)
private UUID uuid;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "rank_name")
private Rank rank;
public static void init(){}
@Column(name = "rank_expiry")
private LocalDateTime rankExpiry;
@Column(name = "name")
private String name;
@Column(name = "permanent", nullable = false)
private boolean permanent;
}
package com.carinaschoppe.playLegendBewerbung.database;
import io.ebean.DB;
import io.ebean.Database;
import io.ebean.Query;
import io.ebean.annotation.Transactional;
import javax.inject.Singleton;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
@Singleton
public class PlayerDAO {
public static void init(){}
private final Database database;
public PlayerDAO(Database database) {
this.database = database;
}
/**
* Speichert oder aktualisiert einen Spieler in der Datenbank.
*
* @param databasePlayer Das zu speichernde Player-Objekt.
*/
@Transactional
public void savePlayer(DatabasePlayer databasePlayer) {
database.save(databasePlayer); // Automatisch speichern oder aktualisieren
}
/**
* Holt einen Spieler anhand seiner UUID aus der Datenbank.
*
* @param uuid Die UUID des Spielers.
* @return Der Spieler mit der angegebenen UUID oder null, falls nicht gefunden.
*/
@Transactional
public Optional<DatabasePlayer> getPlayerByUUID(UUID uuid) {
return Optional.ofNullable(database.find(DatabasePlayer.class, uuid));
}
/**
* Holt alle Spieler aus der Datenbank.
*
* @return Eine Liste aller Spieler.
*/
@Transactional
public List<DatabasePlayer> getAllPlayers() {
// Erstellen einer Ebean-Abfrage, um alle Spieler abzurufen
Query<DatabasePlayer> query = database.find(DatabasePlayer.class);
// Abfrage ausführen und Liste der Spieler zurückgeben
return query.findList();
}
public List<DatabasePlayer> findPlayersByName(String name) {
Query<DatabasePlayer> query = database.find(DatabasePlayer.class).where().eq("name", name).query();
return query.findList();
}
public void updatePlayer(DatabasePlayer player) {
database.update(player);
}
// Spieler löschen
public void deletePlayer(DatabasePlayer player) {
database.delete(player);
}
}
</code>
package com.carinaschoppe.playLegendBewerbung.database;
import io.ebean.Model;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
import java.util.UUID;
@Entity
@Table(name = "players")
@Getter
@Setter
public class DatabasePlayer extends Model {
@Id
@Column(name = "uuid", unique = true, nullable = false)
private UUID uuid;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "rank_name")
private Rank rank;
public static void init(){}
@Column(name = "rank_expiry")
private LocalDateTime rankExpiry;
@Column(name = "name")
private String name;
@Column(name = "permanent", nullable = false)
private boolean permanent;
}
package com.carinaschoppe.playLegendBewerbung.database;
import io.ebean.DB;
import io.ebean.Database;
import io.ebean.Query;
import io.ebean.annotation.Transactional;
import javax.inject.Singleton;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
@Singleton
public class PlayerDAO {
public static void init(){}
private final Database database;
public PlayerDAO(Database database) {
this.database = database;
}
/**
* Speichert oder aktualisiert einen Spieler in der Datenbank.
*
* @param databasePlayer Das zu speichernde Player-Objekt.
*/
@Transactional
public void savePlayer(DatabasePlayer databasePlayer) {
database.save(databasePlayer); // Automatisch speichern oder aktualisieren
}
/**
* Holt einen Spieler anhand seiner UUID aus der Datenbank.
*
* @param uuid Die UUID des Spielers.
* @return Der Spieler mit der angegebenen UUID oder null, falls nicht gefunden.
*/
@Transactional
public Optional<DatabasePlayer> getPlayerByUUID(UUID uuid) {
return Optional.ofNullable(database.find(DatabasePlayer.class, uuid));
}
/**
* Holt alle Spieler aus der Datenbank.
*
* @return Eine Liste aller Spieler.
*/
@Transactional
public List<DatabasePlayer> getAllPlayers() {
// Erstellen einer Ebean-Abfrage, um alle Spieler abzurufen
Query<DatabasePlayer> query = database.find(DatabasePlayer.class);
// Abfrage ausführen und Liste der Spieler zurückgeben
return query.findList();
}
public List<DatabasePlayer> findPlayersByName(String name) {
Query<DatabasePlayer> query = database.find(DatabasePlayer.class).where().eq("name", name).query();
return query.findList();
}
public void updatePlayer(DatabasePlayer player) {
database.update(player);
}
// Spieler löschen
public void deletePlayer(DatabasePlayer player) {
database.delete(player);
}
}
my Application File:
<code> # Name der Standarddatenbank
db:
# Datenquelle konfigurieren
datasource:
username: root # Benutzername für die Datenbank
password: "" # Passwort für die Datenbank (leer lassen, falls nicht erforderlich)
url: jdbc:mysql://localhost:3306/database # URL der MySQL-Datenbank
driver: com.mysql.cj.jdbc.Driver # JDBC-Treiber für MySQL
# Automatische Generierung und Ausführung von DDL (Tabellenerstellung)
ddl:
generate: true # Automatisch DDL (Tabellen) generieren
run: true # DDL beim Starten ausführen (Tabellen erstellen)
# Debug-Einstellungen, um die ausgeführten SQL-Befehle zu sehen
debug:
sql: true # SQL-Befehle in den Logs anzeigen
# Weitere Datenbankeinstellungen (optional)
# minConnections: 2
# maxConnections: 100
# isolationLevel: READ_COMMITTED
code here
</code>
<code> # Name der Standarddatenbank
db:
# Datenquelle konfigurieren
datasource:
username: root # Benutzername für die Datenbank
password: "" # Passwort für die Datenbank (leer lassen, falls nicht erforderlich)
url: jdbc:mysql://localhost:3306/database # URL der MySQL-Datenbank
driver: com.mysql.cj.jdbc.Driver # JDBC-Treiber für MySQL
# Automatische Generierung und Ausführung von DDL (Tabellenerstellung)
ddl:
generate: true # Automatisch DDL (Tabellen) generieren
run: true # DDL beim Starten ausführen (Tabellen erstellen)
# Debug-Einstellungen, um die ausgeführten SQL-Befehle zu sehen
debug:
sql: true # SQL-Befehle in den Logs anzeigen
# Weitere Datenbankeinstellungen (optional)
# minConnections: 2
# maxConnections: 100
# isolationLevel: READ_COMMITTED
code here
</code>
# Name der Standarddatenbank
db:
# Datenquelle konfigurieren
datasource:
username: root # Benutzername für die Datenbank
password: "" # Passwort für die Datenbank (leer lassen, falls nicht erforderlich)
url: jdbc:mysql://localhost:3306/database # URL der MySQL-Datenbank
driver: com.mysql.cj.jdbc.Driver # JDBC-Treiber für MySQL
# Automatische Generierung und Ausführung von DDL (Tabellenerstellung)
ddl:
generate: true # Automatisch DDL (Tabellen) generieren
run: true # DDL beim Starten ausführen (Tabellen erstellen)
# Debug-Einstellungen, um die ausgeführten SQL-Befehle zu sehen
debug:
sql: true # SQL-Befehle in den Logs anzeigen
# Weitere Datenbankeinstellungen (optional)
# minConnections: 2
# maxConnections: 100
# isolationLevel: READ_COMMITTED
code here