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

jpaIniziare con jpa


Osservazioni

JPA è Java Persistence API, una specifica che gestisce la mappatura degli oggetti Java e le loro relazioni con un database relazionale. Questo è chiamato mappatore di oggetti relazionale (ORM). È un'alternativa per (o integrare a) il JDBC di livello più basso. È molto utile quando si persegue un approccio orientato a Java e quando i grafici di oggetti complessi devono essere mantenuti.

L'APP di per sé non è un'implementazione. Avrai bisogno di un fornitore di persistenza per questo (vedi esempi). Le attuali implementazioni dell'ultimo standard JPA 2.1 sono EclipseLink (anche l'implementazione di riferimento per JPA 2.1, che significa "prova che le specifiche possono essere implementate"); Hibernate e DataNucleus .

Metadati

La mappatura tra oggetti Java e tabelle di database viene definita tramite metadati di persistenza . Il provider JPA utilizzerà le informazioni sui metadati di persistenza per eseguire le operazioni corrette del database. In genere, JPA definisce i metadati tramite annotazioni nella classe Java.

Object-Relational Entity Architecture

L'architettura dell'entità è composta da:

  • entità
  • unità di persistenza
  • contesti di persistenza
  • fabbriche di gestori di entità
  • gestori di entità

Versioni

Versione Gruppo di esperti pubblicazione
1.0 JSR-220 2006-11-06
2.0 JSR-317 2009-12-10
2.1 JSR-338 2013/05/22

Ciao mondo

Vediamo tutti i componenti di base per creare un semplice Hallo World.

  1. Definire quale implementazione di JPA 2.1 useremo
  2. Costruisci la connessione al database creando l' persistence-unit
  3. Implementa le entità
  4. Implementa DAO (oggetto di accesso ai dati) per manipolare le entità
  5. Testare l'applicazione

biblioteche

Usando Maven, abbiamo bisogno di queste dipendenze:

<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>
 

Unità di Persistenza

Nella cartella delle risorse è necessario creare un file chiamato persistence.xml . Il modo più semplice per definirlo è come questo:

<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>
 

Implementare un'entità

Creo un Biker classe:

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;
    }
}
 

Implementa un 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 è un 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;
    }
}
 

Testare l'applicazione

pacchetto it.hello.jpa.test;

classe pubblica 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));
}
 

}

L'output sarà:

Running it.hello.jpa.test.TestJpa Hibernate: drop table BIKER se esiste Hibernate: drop sequence se esiste hibernate_sequence Hibernate: crea sequenza hibernate_sequence inizia con 1 incrementa di 1 Hibernate: crea table BIKER (id bigint non nullo, battleName varchar (255 ), barba boolean, data compleanno, bikerName varchar (255), registrationDate time, chiave primaria (id)) Ibernazione: alter table BIKER aggiungi vincolo UK_a64ce28nywyk8wqrvfkkuapli unique (battleName) Hibernate: inserisci in BIKER (battleName, beard, birthday, bikerName, registrationDate , id) valori (?,?,?,?,?,?) mar 01, 2017 11:00:02 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation INFO: HHH000204: Elaborazione PersistenceUnitInfo [nome: ciao- jpa-pu ...] Risultati:

Esecuzione test: 1, Errori: 0, Errori: 0, Salto: 0

Installazione o configurazione

Requisiti del percorso di classe

EclipseLink

È necessario includere l'API Eclipse e JPA. Esempi di dipendenze Maven:

<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>
 

ibernare

Hibernate-core è richiesto. Esempio di dipendenza da Maven:

<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

sono richiesti datanucleus-core, datanucleus-api-jpa e datanucleus-rdbms (quando si utilizzano i datastore RDBMS). Esempio di dipendenza da Maven:

<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>
 

Dettagli di configurazione

JPA richiede l'uso di un file persistence.xml , che si trova sotto META-INF dalla radice di CLASSPATH. Questo file contiene una definizione delle unità di persistenza disponibili da cui JPA può operare.

JPA consente inoltre l'uso di un file di configurazione di mappatura orm.xml , anch'esso collocato sotto META-INF . Questo file di mappatura viene utilizzato per configurare il modo in cui le classi sono mappate all'archivio dati ed è un'alternativa / supplemento all'uso delle annotazioni Java nelle stesse classi di entità JPA.

Minimal persistence.xml esempio

Ibernazione (e DB H2 incorporato)

<?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 (e H2 DB incorporato)

<?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 (e DB H2 incorporato)

<?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>