From 3ab16e630302695e3a83c1d9d6c4471afcafa36d Mon Sep 17 00:00:00 2001 From: Mika Date: Tue, 11 Feb 2025 16:30:23 +0100 Subject: [PATCH] feat(db): Add hibernate and SQLite --- build.gradle | 8 +++- .../survivalGames/SurvivalGames.java | 26 ++++++++++ .../database/BaseRepository.java | 47 +++++++++++++++++++ .../survivalGames/database/Database.java | 31 ------------ .../survivalGames/database/HibernateUtil.java | 26 ++++++++++ .../survivalGames/database/Table.java | 6 --- .../database/player/PlayerEntity.java | 19 ++++++++ .../database/player/PlayerRepository.java | 9 ++++ 8 files changed, 134 insertions(+), 38 deletions(-) create mode 100644 src/main/java/de/polyfish0/survivalGames/database/BaseRepository.java delete mode 100644 src/main/java/de/polyfish0/survivalGames/database/Database.java create mode 100644 src/main/java/de/polyfish0/survivalGames/database/HibernateUtil.java delete mode 100644 src/main/java/de/polyfish0/survivalGames/database/Table.java create mode 100644 src/main/java/de/polyfish0/survivalGames/database/player/PlayerEntity.java create mode 100644 src/main/java/de/polyfish0/survivalGames/database/player/PlayerRepository.java diff --git a/build.gradle b/build.gradle index c24bd94..c7f24a5 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java' + id 'com.github.johnrengelman.shadow' version '7.1.2' } group = 'de.polyfish0' @@ -18,15 +19,20 @@ repositories { } dependencies { + implementation(platform("org.hibernate.orm:hibernate-platform:6.6.7.Final")) + compileOnly("org.spigotmc:spigot-api:1.21.3-R0.1-SNAPSHOT") - compileOnly 'org.projectlombok:lombok:1.18.36' + compileOnly('org.projectlombok:lombok:1.18.36') annotationProcessor 'org.projectlombok:lombok:1.18.36' testCompileOnly 'org.projectlombok:lombok:1.18.36' testAnnotationProcessor 'org.projectlombok:lombok:1.18.36' implementation("org.xerial:sqlite-jdbc:3.48.0.0") + implementation("org.hibernate.orm:hibernate-core:6.6.7.Final") + implementation("jakarta.transaction:jakarta.transaction-api") + implementation("org.hibernate.orm:hibernate-community-dialects:6.6.7.Final") } def targetJavaVersion = 21 diff --git a/src/main/java/de/polyfish0/survivalGames/SurvivalGames.java b/src/main/java/de/polyfish0/survivalGames/SurvivalGames.java index db61ac8..fb174a0 100644 --- a/src/main/java/de/polyfish0/survivalGames/SurvivalGames.java +++ b/src/main/java/de/polyfish0/survivalGames/SurvivalGames.java @@ -4,10 +4,15 @@ import com.google.common.reflect.ClassPath; import de.polyfish0.survivalGames.annotations.Command; import de.polyfish0.survivalGames.annotations.EventClass; import de.polyfish0.survivalGames.annotations.Permission; +import de.polyfish0.survivalGames.database.HibernateUtil; +import de.polyfish0.survivalGames.database.player.PlayerEntity; +import de.polyfish0.survivalGames.database.player.PlayerRepository; +import org.bukkit.Bukkit; import org.bukkit.command.CommandExecutor; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; +import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.HashSet; @@ -24,6 +29,22 @@ public final class SurvivalGames extends JavaPlugin { public void onEnable() { plugin = this; + File folder = new File(String.format("plugins/%s", getDescription().getName())); + + if(!folder.isDirectory()) + folder.delete(); + + if(!folder.exists()) + folder.mkdirs(); + + /*PlayerEntity player = new PlayerEntity(0L, "Mika"); + PlayerRepository playerRepository = new PlayerRepository(); + playerRepository.save(player).thenRun(() -> { + Bukkit.getScheduler().runTask(plugin, () -> { + Bukkit.broadcastMessage("Spieler Gepseichert!"); + }); + });*/ + try { ClassPath cp = ClassPath.from(getClass().getClassLoader()); @@ -41,6 +62,11 @@ public final class SurvivalGames extends JavaPlugin { } } + @Override + public void onDisable() { + HibernateUtil.shutdown(); + } + private void registerCommand(Class klass) { if(!CommandExecutor.class.isAssignableFrom(klass)) { logger.log(Level.SEVERE, "Class \"" + klass.getName() + "\" is annotated with @Command but does not implements CommandExecutor"); diff --git a/src/main/java/de/polyfish0/survivalGames/database/BaseRepository.java b/src/main/java/de/polyfish0/survivalGames/database/BaseRepository.java new file mode 100644 index 0000000..afa2d1d --- /dev/null +++ b/src/main/java/de/polyfish0/survivalGames/database/BaseRepository.java @@ -0,0 +1,47 @@ +package de.polyfish0.survivalGames.database; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import java.io.Serializable; +import java.util.concurrent.CompletableFuture; + +public abstract class BaseRepository { + private final Class clazz; + + public BaseRepository(Class clazz) { + this.clazz = clazz; + } + + public CompletableFuture save(Object entity) { + return CompletableFuture.runAsync(() -> { + try (Session session = HibernateUtil.getSession()) { + Transaction tx = session.beginTransaction(); + session.persist(entity); + tx.commit(); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + + public CompletableFuture findById(Class clazz, Long id) { + return CompletableFuture.supplyAsync(() -> { + try (Session session = HibernateUtil.getSession()) { + return session.get(clazz, id); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + }); + } + + public CompletableFuture delete(T entity) { + return CompletableFuture.runAsync(() -> { + try (Session session = HibernateUtil.getSession()) { + Transaction tx = session.beginTransaction(); + session.remove(entity); + tx.commit(); + } + }); + } +} diff --git a/src/main/java/de/polyfish0/survivalGames/database/Database.java b/src/main/java/de/polyfish0/survivalGames/database/Database.java deleted file mode 100644 index 97eea5e..0000000 --- a/src/main/java/de/polyfish0/survivalGames/database/Database.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.polyfish0.survivalGames.database; - -import de.polyfish0.survivalGames.SurvivalGames; -import lombok.Getter; -import org.bukkit.Bukkit; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -public class Database { - @Getter - private static Database instance = new Database(); - - private Connection manager; - - public void connect() { - try { - manager = DriverManager.getConnection(String.format("jdbc:sqlite:plugins/%s/data.db", SurvivalGames.plugin.getDescription().getName())); - if(manager == null) - throw new SQLException("Manager is null"); - } catch (SQLException e) { - e.printStackTrace(); - Bukkit.getPluginManager().disablePlugin(SurvivalGames.plugin); - } - } - - public void createTables() { - manager.createStatement("") - } -} diff --git a/src/main/java/de/polyfish0/survivalGames/database/HibernateUtil.java b/src/main/java/de/polyfish0/survivalGames/database/HibernateUtil.java new file mode 100644 index 0000000..0c2ad15 --- /dev/null +++ b/src/main/java/de/polyfish0/survivalGames/database/HibernateUtil.java @@ -0,0 +1,26 @@ +package de.polyfish0.survivalGames.database; + +import de.polyfish0.survivalGames.SurvivalGames; +import de.polyfish0.survivalGames.database.player.PlayerEntity; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; + +public class HibernateUtil { + private static final SessionFactory sessionFactory = new Configuration() + .setProperty("hibernate.connection.driver_class", "org.sqlite.JDBC") + .setProperty("hibernate.connection.url", String.format("jdbc:sqlite:plugins/%s/database.db", SurvivalGames.plugin.getDescription().getName())) + .setProperty("hibernate.dialect", "org.hibernate.community.dialect.SQLiteDialect") + .setProperty("hibernate.hbm2ddl.auto", "create") + .setProperty("hibernate.show_sql", "true") + .addAnnotatedClass(PlayerEntity.class) + .buildSessionFactory(); + + public static Session getSession() { + return sessionFactory.openSession(); + } + + public static void shutdown() { + sessionFactory.close(); + } +} \ No newline at end of file diff --git a/src/main/java/de/polyfish0/survivalGames/database/Table.java b/src/main/java/de/polyfish0/survivalGames/database/Table.java deleted file mode 100644 index 6ac6700..0000000 --- a/src/main/java/de/polyfish0/survivalGames/database/Table.java +++ /dev/null @@ -1,6 +0,0 @@ -package de.polyfish0.survivalGames.database; - -public interface Table { - void setup(); - void update(); -} diff --git a/src/main/java/de/polyfish0/survivalGames/database/player/PlayerEntity.java b/src/main/java/de/polyfish0/survivalGames/database/player/PlayerEntity.java new file mode 100644 index 0000000..8a1c37f --- /dev/null +++ b/src/main/java/de/polyfish0/survivalGames/database/player/PlayerEntity.java @@ -0,0 +1,19 @@ +package de.polyfish0.survivalGames.database.player; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class PlayerEntity { + @Id + private Long id; + private String name; +} \ No newline at end of file diff --git a/src/main/java/de/polyfish0/survivalGames/database/player/PlayerRepository.java b/src/main/java/de/polyfish0/survivalGames/database/player/PlayerRepository.java new file mode 100644 index 0000000..06acb65 --- /dev/null +++ b/src/main/java/de/polyfish0/survivalGames/database/player/PlayerRepository.java @@ -0,0 +1,9 @@ +package de.polyfish0.survivalGames.database.player; + +import de.polyfish0.survivalGames.database.BaseRepository; + +public class PlayerRepository extends BaseRepository { + public PlayerRepository() { + super(PlayerEntity.class); + } +}