Looking for jpa Answers? Try Ask4KnowledgeBase
Looking for jpa Keywords? Try Ask4Keywords

jpaErste Schritte mit jpa


Bemerkungen

JPA ist die Java Persistence API, eine Spezifikation, die die Zuordnung von Java-Objekten und deren Beziehungen zu einer relationalen Datenbank behandelt. Dies wird als objektrelationaler Mapper (ORM) bezeichnet. Es ist eine Alternative für (oder eine Ergänzung) zu JDBC mit niedrigerem Level. Dies ist besonders nützlich, wenn Sie einen Java-orientierten Ansatz verfolgen und wenn komplexe Objektdiagramme persistent sein müssen.

JPA an sich ist keine Implementierung. Sie benötigen dafür einen Persistenzanbieter (siehe Beispiele). Aktuelle Implementierungen des neuesten JPA 2.1-Standards sind EclipseLink (auch die Referenzimplementierung für JPA 2.1, was "den Nachweis der Implementierung der Spezifikation" bedeutet). Ruhezustand und DataNucleus .

Metadaten

Die Zuordnung zwischen Java-Objekten und Datenbanktabellen wird über Persistenz-Metadaten definiert. Der JPA-Anbieter verwendet die Persistenz-Metadaten-Informationen, um die korrekten Datenbankvorgänge auszuführen. JPA definiert die Metadaten normalerweise über Anmerkungen in der Java-Klasse.

Objektbezogene Entity-Architektur

Die Entitätsarchitektur besteht aus:

  • Entitäten
  • Persistenzeinheiten
  • Persistenzkontexte
  • Entitätenmanagerfabriken
  • Entity-Manager

Versionen

Ausführung Expertengruppe Veröffentlichung
1,0 JSR-220 2006-11-06
2,0 JSR-317 2009-12-10
2.1 JSR-338 2013-05-22

Hallo Welt

Lassen Sie uns alle grundlegenden Komponenten für die Erstellung einer einfachen Hallo-Welt sehen.

  1. Definieren Sie, welche Implementierung von JPA 2.1 verwendet wird
  2. Stellen Sie die Verbindung zur Datenbank her und erstellen Sie die persistence-unit
  3. Implementiert die Entitäten
  4. Implementiert ein DAO (Datenzugriffsobjekt) zum Bearbeiten der Entitäten
  5. Testen Sie die Anwendung

Bibliotheken

Mit Maven brauchen wir diese Abhängigkeiten:

<dependencies>

    <!-- JPA is a spec, I'll use the implementation with HIBERNATE -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.2.6.Final</version>
    </dependency>

    <!-- JDBC Driver, use in memory DB -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.193</version>
    </dependency>

</dependencies>
 

Persistenzeinheit

Im Ressourcenordner müssen wir eine Datei mit dem Namen persistence.xml erstellen. Der einfachste Weg zum Definieren ist wie folgt:

<persistence-unit name="hello-jpa-pu" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

    <properties>
        <!-- ~ = relative to current user home directory -->
        <property name="javax.persistence.jdbc.url" value="jdbc:h2:./test.db"/>
        <property name="javax.persistence.jdbc.user" value=""/>
        <property name="javax.persistence.jdbc.password" value=""/>
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
        <property name="hibernate.show_sql" value="true"/>

        <!-- This create automatically the DDL of the database's table -->
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>

    </properties>
</persistence-unit>
 

Implementiere eine Entität

Ich erstelle eine Klasse Biker :

package it.hello.jpa.entities;


import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

@Entity
@Table(name = "BIKER")
public class Biker implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "bikerName")
    private String name;

    @Column(unique = true, updatable = false)
    private String battleName;

    private Boolean beard;

    @Temporal(TemporalType.DATE)
    private Date birthday;

    @Temporal(TemporalType.TIME)
    private Date registrationDate;

    @Transient // --> this annotiation make the field transient only for JPA
    private String criminalRecord; 

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBattleName() {
        return battleName;
    }

    public void setBattleName(String battleName) {
        this.battleName = battleName;
    }

    public Boolean getBeard() {
        return this.beard;
    }

    public void setBeard(Boolean beard) {
        this.beard = beard;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Date getRegistrationDate() {
        return registrationDate;
    }

    public void setRegistrationDate(Date registrationDate) {
        this.registrationDate = registrationDate;
    }

    public String getCriminalRecord() {
        return criminalRecord;
    }

    public void setCriminalRecord(String criminalRecord) {
        this.criminalRecord = criminalRecord;
    }
}
 

Implementieren Sie ein DAO

package it.hello.jpa.business;

import it.hello.jpa.entities.Biker;

import javax.persistence.EntityManager;
import java.util.List;

public class MotorcycleRally {

    public Biker saveBiker(Biker biker) {
        EntityManager em = EntityManagerUtil.getEntityManager();
        em.getTransaction().begin();
        em.persist(biker);
        em.getTransaction().commit();
        return biker;
    }

}
 

EntityManagerUtil ist ein Singleton:

package it.hello.jpa.utils;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class EntityManagerUtil {

    // USE THE SAME NAME IN persistence.xml!
    public static final String PERSISTENCE_UNIT_NAME = "hello-jpa-pu";

    private static EntityManager entityManager;

    private EntityManagerUtil() {
    }

    public static EntityManager getEntityManager() {
        if (entityManager == null) {
            // the same in persistence.xml
            EntityManagerFactory emFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);


            return emFactory.createEntityManager();
        }
        return entityManager;
    }
}
 

Testen Sie die Anwendung

Paket it.hello.jpa.test;

öffentliche Klasse TestJpa {

@Test
public void insertBiker() {
    MotorcycleRally crud = new MotorcycleRally();

    Biker biker = new Biker();
    biker.setName("Manuel");
    biker.setBeard(false);

    biker = crud.saveBiker(biker);

    Assert.assertEquals(biker.getId(), Long.valueOf(1L));
}
 

}

Die Ausgabe wird sein:

It.hello.jpa.test.TestJpa ausführen Ruhezustand: Drop-Tabelle BIKER, falls vorhanden Ruhezustand: Drop-Sequenz, wenn vorhanden Hibernate_sequence Hibernate: Sequenz Hibernate_sequence beginnen mit 1 Inkrement um 1 Hibernate: Tabelle BIKER erstellen (id bigint nicht null, battleName varar (255) ), Bart Boolean, Geburtstagsdatum, BikerName Varchar (255), RegistrationDatum-Zeit, Primärschlüssel (ID)) Ruhezustand: Änderungstabelle BIKER Add-Einschränkung , id) Werte (?,?,?,?,?,?) 01. März 2017 23:00:02 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation INFO: HHH000204: Verarbeitung von PersistenceUnitInfo [Name: hello- jpa-pu ...] Ergebnisse:

Tests: 1, Fehler: 0, Fehler: 0, Übersprungen: 0

Installation oder Setup

Klassenpfadanforderungen

Eclipselink

Die Eclipselink- und JPA-API muss enthalten sein. Beispiel Maven-Abhängigkeiten:

<dependencies>
  <dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>eclipselink</artifactId>
    <version>2.6.3</version>
  </dependency>
  <dependency>
    <groupId>org.eclipse.persistence</groupId>
    <artifactId>javax.persistence</artifactId>
    <version>2.1.1</version>
  </dependency>
  <!-- ... -->
</dependencies>
 

Überwintern

Hibernate-Core ist erforderlich. Beispiel für eine Maven-Abhängigkeit:

<dependencies>
  <dependency>
    <!-- requires Java8! -->
    <!-- as of 5.2, hibernate-entitymanager is merged into hibernate-core -->
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.2.1.Final</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.1-api</artifactId>
    <version>1.0.0</version>
  </dependency>
  <!-- ... -->
</dependencies>
 

DataNucleus

Datanucleus-Core, Datanucleus-Api-Jpa und Datanucleus-Rdbms (bei Verwendung von RDBMS-Datastores) sind erforderlich. Beispiel für eine Maven-Abhängigkeit:

<dependencies>
  <dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-core</artifactId>
    <version>5.0.0-release</version>
  </dependency>
  <dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-api-jpa</artifactId>
    <version>5.0.0-release</version>
  </dependency>
  <dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>datanucleus-rdbms</artifactId>
    <version>5.0.0-release</version>
  </dependency>
  <dependency>
    <groupId>org.datanucleus</groupId>
    <artifactId>javax.persistence</artifactId>
    <version>2.1.2</version>
  </dependency>
  <!-- ... -->
</dependencies>
 

Konfigurationsdetails

JPA erfordert die Verwendung einer Datei persistence.xml , die sich unter META-INF im Stammverzeichnis des CLASSPATH befindet. Diese Datei enthält eine Definition der verfügbaren Persistenz-Einheiten, von denen aus JPA arbeiten kann.

JPA erlaubt außerdem die Verwendung einer Mapping-Konfigurationsdatei orm.xml , die ebenfalls unter META-INF abgelegt ist. Diese Zuordnungsdatei wird verwendet, um zu konfigurieren, wie Klassen dem Datastore zugeordnet werden. Sie ist eine Alternative / Ergänzung zur Verwendung von Java-Annotationen in den JPA-Entitätsklassen.

Beispiel für minimale Persistenz.xml

Ruhezustand (und eingebettete H2-Datenbank)

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                             http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">

<persistence-unit name="persistenceUnit">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <class>my.application.entities.MyEntity</class>
    
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /> 
        <property name="javax.persistence.jdbc.url" value="jdbc:h2:data/myDB.db" /> 
        <property name="javax.persistence.jdbc.user" value="sa" /> 

        <!-- DDL change options -->
        <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>

        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
        <property name="hibernate.flushMode" value="FLUSH_AUTO" /> 
    </properties>
</persistence-unit>
</persistence>
 

Eclipselink (und eingebettete H2-Datenbank)

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                             http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">

<persistence-unit name="persistenceUnit">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

    <class>my.application.entities.MyEntity</class>
    
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:h2:data/myDB.db"/>
        <property name="javax.persistence.jdbc.user" value="sa"/>

        <!-- Schema generation : drop and create tables -->
        <property name="javax.persistence.schema-generation.database.action" value="drop-and-create-tables" />
    </properties>
</persistence-unit>

</persistence>
 

DataNucleus (und eingebettete H2-Datenbank)

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                             http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">

<persistence-unit name="persistenceUnit">
    <provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>

    <class>my.application.entities.MyEntity</class>
    
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:h2:data/myDB.db"/>
        <property name="javax.persistence.jdbc.user" value="sa"/>

        <!-- Schema generation : drop and create tables -->
        <property name="javax.persistence.schema-generation.database.action" value="drop-and-create-tables" />
    </properties>
</persistence-unit>

</persistence>