cvičení 05

Java Persistence API - JPA
Java Persistent API
V projektu cvičení 1 , cvičení 2, cvičení 3
Upravte projekt tak aby se Score ukládalo do databáze pomocí JPA.
Závislosti
Pro využití JPA musíme přidat závislosti na knihovny jakarta.persistence-api verze 3.2.0 a hibernate-core verze 6.6.11.Final
Module info
Projekt bude potřebovat využít moduly jakarta.persistence a org.hibernate.orm.core.
Taky je nutno balík lab.data otevřít všem ne jen balíku javafx.base aby si jej Hibernate mohl pomocí reflexe zpracovat.
Konfigurace JPA
Do složky src/main/resources/META-INF přidejte soubor persistence.xml ten je hlavním konfiguračním souborem pro JPA.
Obsah souboru je uveden níže a můžete tam najít jméno perzistentní jednotky (to budete využívat ve zdrojových kódech), nastavení připojení na databázi a nastavení samotného Hibernetu, třeba to, že se má pokusit vytvořit databázové schéma podle entitních tříd.
<?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>
Entitní třída Score
Třídu Score upravte tak aby byla platnou entitní třídou:
- Přidejte anotaci pro entitní třídy
- Přidejte anotaci pro id a anotaci pro automatické generování id
- Přidejte konstruktor bez parametrů
JpaConnector
Naimplementujte metody JPA konektoru tak aby hra fungovala jak má a aby prošli všechny UnitTesty.
- Potřebujete vytvořit a zapamatovat si EntityManagerFactory a EntityManager. Na to by se dal použít konstruktor.
- EntityManager umí pomocí createQuery vytvořit dotaz velice podobný jazyku SQL, ale pozor na rozdíly (viz přednáška)
- U metod, které mění obsah DB musíte použít transakce (getTransaction a begin a commit)
- metoda save by podle id entity měla rozhodnout zda použije persist nebo merge a měla by vracet uložený objekt.
- metoda modifyNoPersistOrMerge by měla načíst Score dle id a poté na něj použít předaný Consumer, který skóre modifikuje. Pak by se měla zajistit synchronizace dat s DB, aby se data uložila, ale nepoužívejte metody persist ani merge, vzpomeňte co jsme si říkali na přednášce o managed entitách.
Změna ve Score
Zajistěte aby se enum hodnota level ukládala do DB jako text a ne jako číslo.
- použijte vhodnou anotaci
- nezapomeňte smazat DB, mění se typ sloupce a to nejde automaticky
Řešení
Řešení najdete v https://gitlab.vsb.cz/jez04-vyuka/java2/labs/java2lab05v1/-/tree/solution?ref_type=heads ve větvi solution.
https://gitlab.vsb.cz/jez04-vyuka/java2/labs/java2lab05v2/-/tree/solution?ref_type=heads
https://gitlab.vsb.cz/jez04-vyuka/java2/labs/java2lab05v3/-/tree/solution?ref_type=heads