%Teilweise Erzeugt mit dem LaTeX-Generator: http://latex.sehnot.de

%Schriftgröße, Layout, Papierformat, Art des Dokumentes
\documentclass[10pt,oneside,a4paper]{scrartcl}

%Einstellungen der Seitenränder
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}

%neue Rechtschreibung
\usepackage[ngerman]{babel}

%Umlaute ermöglichen
\usepackage[utf8]{inputenc}

%Gesamtseitenzahl
\usepackage{lastpage}

% Kopf- und Fußzeile
\usepackage[automark]{scrpage2}

%Hyperlinks
\usepackage{hyperref}

%Quellcode-Listings
\usepackage{listings}

%Kopfzeile
\ihead{Java}
\chead{}
\ohead{http://kohnlehome.de/java/jpa-maven.pdf}
\setheadsepline{0.5pt}

%Fußzeile
\setfootsepline{0.5pt}
\ifoot{Franz Kohnle}
\cfoot{Seite \thepage\ von  \pageref{LastPage}}
\ofoot{\today}

\pagestyle{scrheadings}

\begin{document}

% Überschrift 
\begin{center}
\LARGE % Schriftgröße
\bfseries % Fettdruck
\sffamily % Serifenlose Schrift
JPA mit Maven
\end{center}

\section{leere Datenbank erstellen}
\begin{lstlisting}
mysql> CREATE DATABASE beispieldb;

mysql> CREATE USER 'benutzer'@'localhost';
mysql> ALTER USER  'benutzer'@'localhost' IDENTIFIED BY 'passwort';

mysql> GRANT ALL PRIVILEGES ON beispieldb.* TO 'benutzer'@'localhost';
\end{lstlisting}

\section{Maven-Projekt erstellen}
\begin{itemize}
\item maven-archetype-quickstart
\item GroupId: de.gbsschulen.jpabeispiel
\item ArtifactId: jpabeispiel
\end{itemize}

\section{Java 11 konfigurieren in pom.xml}
\subsection*{Löschen}
\begin{verbatim}
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
\end{verbatim}

\subsection*{Erweitern}
\begin{verbatim}
<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.8.0</version>
  <configuration>
    <release>11</release>
  </configuration>
</plugin>
\end{verbatim}

\section{Dependencies hinzufügen in pom.xml}
\begin{verbatim}
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.18</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.eclipse.persistence/org.eclipse.persistence.jpa -->
<dependency>
  <groupId>org.eclipse.persistence</groupId>
  <artifactId>eclipselink</artifactId>
  <version>2.7.5</version>
</dependency>
\end{verbatim}

\newpage

\section{JPA-Konfigurationsdatei src/main/resources/META-INF/persistence.xml}
\begin{verbatim}
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="BeispielPU" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>de.gbsschulen.jpabeispiel.Person</class>
        <properties>
            <property name="javax.persistence.jdbc.url"
                      value="jdbc:mysql://localhost:3306/beispieldb?serverTimezone=UTC"/>
            <property name="javax.persistence.jdbc.user"
                      value="benutzer"/>
            <property name="javax.persistence.jdbc.password"
                      value="passwort"/>
            <property name="eclipselink.ddl-generation"
                      value="drop-and-create-tables"/>
        </properties>
    </persistence-unit>
</persistence>
\end{verbatim}

\section{de.gbsschulen.jpabeispiel.Person}
\begin{verbatim}
package de.gbsschulen.jpabeispiel;

import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.UUID;

@Entity
public class Person {
    @Id
    private String id;
    private String vorname;
    private String nachname;

    public Person(String vorname, String nachname) {
        this.id = UUID.randomUUID().toString();        
        this.vorname = vorname;
        this.nachname = nachname;
    }
    
    public Person() { this("Max", "Mustermann"); }

    public String getVorname() { return vorname; }

    public void setVorname(String vorname) { this.vorname = vorname; }

    public String getNachname() { return nachname; }

    public void setNachname(String nachname) { this.nachname = nachname; }
}
\end{verbatim}

\section{Entity-Manager und Transaktion}
\begin{verbatim}
EntityManagerFactory emf = Persistence.createEntityManagerFactory("BeispielPU");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();

// Hier CRUD-Aktionen ausführen

em.getTransaction().commit();
em.close();
emf.close();
\end{verbatim}

\section{CRUD-Operationen}
\subsection*{CREATE}
\begin{verbatim}
Person person = new Person();
em.persist(person);
\end{verbatim}

\subsection*{READ}
\begin{verbatim}
Person person = em.find(Person.class, "d4319f2b-ad8a-44bf-ac14-43d03d78920a"); // primary key
\end{verbatim}
oder
\begin{verbatim}
Query query = em.createQuery("SELECT Person FROM Person person"); // JPQL
List<Person> list = query.getResultList();
for (Person person : list) {
    ... = person ...
}
\end{verbatim}

\subsection*{UPDATE}
\begin{verbatim}
person.setVorname("Anna");
\end{verbatim}

\subsection*{DELETE}
\begin{verbatim}
em.remove(person);
\end{verbatim}



\end{document}
