diff --git a/pom.xml b/pom.xml index 37ba4cf8f06b9b01aba7f038693c2f0ebc72bdf0..1d13de2c27e2d79e72ef2767846e5b90b25c815c 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,22 @@ </repository> </repositories> <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.orm/hibernate-core --> + <dependency> + <groupId>org.hibernate.orm</groupId> + <artifactId>hibernate-core</artifactId> + <version>6.6.11.Final</version> + </dependency> + <dependency> <groupId>cz.vsb.fei</groupId> <artifactId>kelvin-java-unittest-support</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..818aba97fd1ade8c0178fd67f60879bec6c34b0c 100644 --- a/src/main/java/lab/storage/JpaConnector.java +++ b/src/main/java/lab/storage/JpaConnector.java @@ -4,51 +4,80 @@ 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 entityManagerFactory; + private EntityManager entityManager; public JpaConnector() { + entityManagerFactory = Persistence.createEntityManagerFactory("java2"); + entityManager = entityManagerFactory.createEntityManager(); } @Override public List<Score> getAll() { - return Collections.emptyList(); + return entityManager.createQuery("select s from Score s", Score.class).getResultList(); } @Override public List<Score> getFirstTen() { - return Collections.emptyList(); + return entityManager.createQuery("select s from Score s order by s.points DESC", Score.class).setMaxResults(10).getResultList(); } @Override public void init() { + /*nothing to do*/ } @Override public Score save(Score score) { - return null; + Score result; + entityManager.getTransaction().begin(); + if(score.getId() == null || score.getId() == 0) { + entityManager.persist(score); + result = score; + } else { + result = entityManager.merge(score); + } + entityManager.getTransaction().commit();; + return result; } @Override public void delete(List<Score> scores) { + entityManager.getTransaction().begin(); + for (Score score : scores) { + entityManager.remove(score); + } + entityManager.getTransaction().commit();; } @Override public void stop() { + entityManager.close(); + entityManagerFactory.close(); } public Object getEntityManager() { //return entity manager. Type Object is there because of compilation of empty task assignment - return null; + return entityManager; } public Score find(long id) { - return null; + return entityManager.find(Score.class, id); } public void modifyNoPersistOrMerge(long id, Consumer<Score> motificator) { + entityManager.getTransaction().begin(); + Score score = entityManager.find(Score.class, id); + motificator.accept(score); + entityManager.getTransaction().commit();; + } } diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index fd02eeaaf3377d964e9498062cafecd395c77bf0..a98974e2b8c2ffefae3de82cacb14179e5c17da5 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -6,9 +6,11 @@ module cz.vsb.fei.java2.lab03_module { requires org.apache.logging.log4j; requires static lombok; requires com.h2database; + requires jakarta.persistence; + requires org.hibernate.orm.core; opens lab.gui to javafx.fxml; - opens lab.data to javafx.base; + opens lab.data to javafx.base,org.hibernate.orm.core; 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..3a1bac1bb18249f8353d9a891abeeb9d860d0671 --- /dev/null +++ b/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,40 @@ +<?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> \ No newline at end of file diff --git a/src/test/java/jez04/structure/test/ClassStructureTest.java b/src/test/java/jez04/structure/test/ClassStructureTest.java index 21c3023a1e362b7c8191843eee2cbda6fabde061..9fa7dff7e3dbb724da92636cdcc59ab3a7c318b6 100644 --- a/src/test/java/jez04/structure/test/ClassStructureTest.java +++ b/src/test/java/jez04/structure/test/ClassStructureTest.java @@ -46,7 +46,7 @@ class ClassStructureTest { assertThat(TextFileContains.getProjectRoot(getClass()), new TextFileContains("module-info.java", "jakarta.persistence;")); assertThat(TextFileContains.getProjectRoot(getClass()), - new TextFileContains("module-info.java", "opens\\slab.data;")); + new TextFileContains("module-info.java", "opens\\s+lab.data;|opens\\s+lab.data\\s+to\\s+javafx.base,org.hibernate.orm.core;")); } @Test