Sobes.tech
Junior

O que é JPA (Java Persistence API)?

sobes.tech IA

Resposta da IA

O JPA é uma especificação de API para a gestão da persistência de dados em aplicações Java. Ela fornece uma forma padrão de mapear objetos Java para bases de dados relacionais (ou outros armazenamentos de dados) e vice-versa. O JPA faz parte da plataforma Java EE (agora Jakarta EE) e também pode ser usado em aplicações standalone.

Componentes principais do JPA:

  • Entidade: Classes Java normais (POJO), marcadas com a anotação @Entity, que representam dados na base de dados.
  • EntityManager: Interface para interagir com o contexto de persistência. Usada para procurar, criar, atualizar e eliminar entidades.
  • Contexto de Persistência: Conjunto de entidades geridas pelo EntityManager. Aqui são rastreadas as alterações nas entidades antes de serem sincronizadas com a base de dados.
  • JPQL (Java Persistence Query Language): Linguagem de consulta orientada a objetos, semelhante ao SQL, mas que opera com entidades e suas relações em vez de tabelas e colunas.
  • Criteria API: API orientada a objetos para executar consultas dinâmicas.
  • persistence.xml: Ficheiro de configuração que descreve as unidades de persistência e as suas propriedades (por exemplo, informações de ligação à base de dados, estratégias de mapeamento).

O JPA não é uma implementação concreta de ORM (Object-Relational Mapping), mas sim que define contratos e API. Existem vários provedores de JPA que implementam esta especificação, sendo os mais populares:

  • Hibernate
  • EclipseLink
  • Apache OpenJPA

Exemplo de definição de entidade:

// Entidade que representa uma linha na tabela `products`
@Entity
// Nome da tabela na base de dados
@Table(name = "products")
public class Product {

    // Chave primária
    @Id
    // Estratégia de geração da chave primária
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Coluna `name` na tabela
    private String name;

    // Coluna `price` na tabela
    private BigDecimal price;

    // Construtores, getters e setters
    // ...
}

Exemplo de uso de EntityManager:

// Obtenção de EntityManager a partir de EntityManagerFactory
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
EntityManager em = emf.createEntityManager();

try {
    // Início de transação
    em.getTransaction().begin();

    // Criação de uma nova entidade
    Product newProduct = new Product();
    newProduct.setName("Laptop");
    newProduct.setPrice(new BigDecimal("1200.00"));

    // Guardar a entidade na base de dados
    em.persist(newProduct);

    // Procurar uma entidade pela chave primária
    Product foundProduct = em.find(Product.class, 1L);
    System.out.println("Produto encontrado: " + foundProduct.getName());

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

    // Confirmar transação
    em.getTransaction().commit();

} catch (Exception e) {
    // Reverter transação em caso de erro
    if (em.getTransaction().isActive()) {
        em.getTransaction().rollback();
    }
    e.printStackTrace();
} finally {
    // Fechar EntityManager
    em.close();
    // Fechar EntityManagerFactory
    emf.close();
}

O objetivo principal do JPA é simplificar o desenvolvimento de aplicações que trabalham com bases de dados, abstraindo os detalhes de baixo nível do trabalho com JDBC e SQL, fornecendo uma abordagem orientada a objetos para a persistência. Isto aumenta a portabilidade do código e reduz a sua dependência de uma base de dados específica.