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