Sobes.tech
Junior

Cos'è JPA (Java Persistence API)?

sobes.tech AI

Risposta dell'AI

JPA è una specifica API per la gestione della persistenza dei dati nelle applicazioni Java. Fornisce un modo standard per mappare gli oggetti Java sui database relazionali (o altri sistemi di archiviazione) e viceversa. JPA fa parte della piattaforma Java EE (ora Jakarta EE) e può essere utilizzata anche in applicazioni standalone.

Componenti chiave di JPA:

  • Entity: Classi Java normali (POJO), contrassegnate con l’annotazione @Entity, che rappresentano i dati nel database.
  • EntityManager: Interfaccia per interagire con il contesto di persistenza. Usata per cercare, creare, aggiornare e eliminare entità.
  • Contesto di persistenza: Insieme di entità gestite da EntityManager. Qui vengono monitorate le modifiche alle entità prima di sincronizzarle con il database.
  • JPQL (Java Persistence Query Language): Linguaggio di query orientato agli oggetti, simile a SQL, ma che opera con entità e le loro relazioni invece di tabelle e colonne.
  • Criteria API: API orientata agli oggetti per eseguire query dinamiche.
  • persistence.xml: File di configurazione che descrive le unità di persistenza (persistence units) e le loro proprietà (ad esempio, informazioni di connessione al database, strategie di mapping).

JPA non è un’implementazione concreta di ORM (Object-Relational Mapping), ma definisce contratti e API. Esistono diversi provider di JPA che implementano questa specifica, tra cui i più popolari:

  • Hibernate
  • EclipseLink
  • Apache OpenJPA

Esempio di definizione di entità:

// Entità che rappresenta una riga nella tabella `products`
@Entity
// Nome della tabella nel database
@Table(name = "products")
public class Product {

    // Chiave primaria
    @Id
    // Strategia di generazione della chiave primaria
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Colonna `name` nella tabella
    private String name;

    // Colonna `price` nella tabella
    private BigDecimal price;

    // Costruttori, getters e setters
    // ...
}

Esempio di utilizzo di EntityManager:

// Ottenere EntityManager da EntityManagerFactory
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
EntityManager em = emf.createEntityManager();

try {
    // Inizio transazione
    em.getTransaction().begin();

    // Creazione di una nuova entità
    Product newProduct = new Product();
    newProduct.setName("Laptop");
    newProduct.setPrice(new BigDecimal("1200.00"));

    // Salvataggio dell’entità nel database
    em.persist(newProduct);

    // Ricerca di un’entità tramite chiave primaria
    Product foundProduct = em.find(Product.class, 1L);
    System.out.println("Prodotto trovato: " + foundProduct.getName());

    // Esecuzione di una query JPQL
    List<Product> allProducts = em.createQuery("SELECT p FROM Product p", Product.class).getResultList();
    for (Product p : allProducts) {
        System.out.println(p.getName());
    }

    // Commit della transazione
    em.getTransaction().commit();

} catch (Exception e) {
    // Rollback in caso di errore
    if (em.getTransaction().isActive()) {
        em.getTransaction().rollback();
    }
    e.printStackTrace();
} finally {
    // Chiusura di EntityManager
    em.close();
    // Chiusura di EntityManagerFactory
    emf.close();
}

L’obiettivo principale di JPA è semplificare lo sviluppo di applicazioni che lavorano con database, astrando i dettagli di basso livello del lavoro con JDBC e SQL, fornendo un approccio orientato agli oggetti alla persistenza. Ciò aumenta la portabilità del codice e riduce la sua dipendenza da un database specifico.