diff --git a/pom.xml b/pom.xml index 8f66f1179c1ba96b291bf37c7346420ad46d199e..cd4143e395a16392aff997098fb3123119b49301 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,19 @@ </properties> <dependencies> + <!-- https://mvnrepository.com/artifact/jakarta.persistence/jakarta.persistence-api --> + <dependency> + <groupId>jakarta.persistence</groupId> + <artifactId>jakarta.persistence-api</artifactId> + <version>3.2.0</version> + </dependency> + + <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-core</artifactId> + <version>6.6.11.Final</version> + </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> @@ -23,16 +36,14 @@ <scope>provided</scope> </dependency> - <!-- - https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> + <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.24.3</version> </dependency> - <!-- - https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api --> + <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> diff --git a/src/main/java/lab/data/Score.java b/src/main/java/lab/data/Score.java index 435a6c2559cfa5925cad211374cdcd656a1f104b..2be798381f3f0f0634acc64df29fa574b38e4ee7 100644 --- a/src/main/java/lab/data/Score.java +++ b/src/main/java/lab/data/Score.java @@ -2,16 +2,25 @@ package lab.data; import java.util.Random; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +@Entity @Getter @Setter @AllArgsConstructor +@NoArgsConstructor @EqualsAndHashCode @ToString @Builder(toBuilder = true) @@ -19,9 +28,12 @@ public class Score { private static final Random RANDOM = new Random(); + @Id + @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private int points; + @Enumerated(EnumType.STRING) private Level level; diff --git a/src/main/java/lab/storage/JpaConnector.java b/src/main/java/lab/storage/JpaConnector.java index b1f5bf10a6129abf829d8a7283603076b76a2e7d..3dc74583703c73a1a552dd522a7d347cc89a8a08 100644 --- a/src/main/java/lab/storage/JpaConnector.java +++ b/src/main/java/lab/storage/JpaConnector.java @@ -1,25 +1,32 @@ package lab.storage; -import java.util.Collections; import java.util.List; import java.util.function.Consumer; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; import lab.data.Score; public class JpaConnector implements ScoreStorageInterface { + private EntityManagerFactory emf; + private EntityManager em; public JpaConnector() { + emf = Persistence.createEntityManagerFactory("java2"); + em = emf.createEntityManager(); } @Override public List<Score> getAll() { - return Collections.emptyList(); + return em.createQuery("select s from Score s", Score.class).getResultList(); } @Override public List<Score> getFirstTen() { - return Collections.emptyList(); + return em.createQuery("select s from Score s order by s.points DESC", Score.class).setMaxResults(10) + .getResultList(); } @Override @@ -28,27 +35,47 @@ public class JpaConnector implements ScoreStorageInterface { @Override public Score save(Score score) { - return null; + Score result; + em.getTransaction().begin(); + if (score.getId() == null || score.getId() == 0) { + em.persist(score); + result = score; + } else { + result = em.merge(score); + } + em.getTransaction().commit(); + return result; } @Override public void delete(List<Score> scores) { + em.getTransaction().begin(); + for (Score score : scores) { + em.remove(score); + } + em.getTransaction().commit(); } @Override public void stop() { + em.close(); + emf.close(); } public Object getEntityManager() { //return entity manager. Type Object is there because of compilation of empty task assignment - return null; + return em; } public Score find(long id) { - return null; + return em.find(Score.class, id); } public void modifyNoPersistOrMerge(long id, Consumer<Score> motificator) { + em.getTransaction().begin(); + Score score = em.find(Score.class, id); + motificator.accept(score); + em.getTransaction().commit(); } } diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index d40f0a8b9eb3c4f95d9d8dc2e394aa50af043b3e..fb40c0131622735321624afd1208812cd2519922 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -5,10 +5,12 @@ module cz.vsb.fei.java2.lab05_module { requires java.sql; requires org.apache.logging.log4j; requires static lombok; + requires jakarta.persistence; requires com.h2database; + requires org.hibernate.orm.core; opens lab.gui to javafx.fxml; - opens lab.data to javafx.base; + opens lab.data; exports lab.gui to javafx.fxml, javafx.graphics; } \ No newline at end of file diff --git a/src/main/resources/META-INF/persistence.xml b/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6bb5893f6a381403ffae95e2e83faf208ba3f4d --- /dev/null +++ b/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="UTF-8"?> +<persistence version="3.0" + 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_0.xsd"> + <persistence-unit name="java2" + transaction-type="RESOURCE_LOCAL"> + + <!-- If you are running in a production environment, add a managed data + source, this example data source is just for development and testing! --> + <properties> + <property name="jakarta.persistence.jdbc.url" + value="jdbc:h2:file:./db/java2" /> + <!-- In memory DB no store to disk + <property name="jakarta.persistence.jdbc.url" value="jdbc:h2:mem:java2" /> + --> + <property name="jakarta.persistence.jdbc.driver" + value="org.h2.Driver" /> + + + <property name="jakarta.persistence.jdbc.user" value="app" /> + <property name="jakarta.persistence.jdbc.password" + value="app" /> + <property + name="jakarta.persistence.schema-generation.database.action" + value="create"></property> + + <!-- Properties for Hibernate --> + <property name="hibernate.show_sql" value="false" /> + <property name="hibernate.format_sql" value="true" /> + <!-- + <property name="hibernate.hbm2ddl.auto" value="update" /> + --> + + </properties> + </persistence-unit> + +</persistence> +