quarta-feira, 11 de março de 2015

Exemplo de utilização do Java Persistence API - 2

Num artigo anterior criámos, no NetBeans, um projeto para acesso a uma BD ORACLE utilizando a Java Persistence API (JPA).
Entre esse e este artigo tivemos ainda tempo para resolver o problema da gestão de atribuição de chaves primárias no JPA sobre ORACLE.
Vamos, aqui, criar um projeto uma camada acima do anterior, que fornecerá para uma outra camada, de apresentação ou user interface, acima, um conjunto de serviços de lógica de negócio.
A camada de lógica de negócio aqui apresentada é apenas um exemplo possível. O objetivo é concentrar nesta camada os métodos que usam o JPA, de forma a libertar a camada acima (User Interface) desse conhecimento.

Começamos por criar um novo projeto de tipo Java Class Library, tal como anteriormente, e teremos que adicionar às suas Libraries, o projeto DAL feito no  artigo anterior.

Depois, criamos uma classe de apoio, BLLEntityManager.java, para nos fornecer o EntityManager (singleton), e iniciar alterações a objetos geridos (instâncias de JPA Entities já armazenadas na BD).



BLLEntityManager.java:

package BLL;

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

public class BLLEntityManager {
    private static final String PERSISTENCE_UNIT_NAME =

                                             "exJPAusagePU";
    private static EntityManagerFactory factory;
   
    private static EntityManager em = null;
   
    public static EntityManager getEntityManager() 

    {
        if (em==null)
        {
            factory = Persistence

              .createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
            em = factory.createEntityManager();
        }
        return em;
    }
   
    public static void beginUpdate()
    {
        EntityManager em = BLLEntityManager.getEntityManager();
        em.getTransaction().begin();
    }

    public static void endUpdate()

    {
        EntityManager em = BLLEntityManager.getEntityManager();
        em.getTransaction().commit();
        em.clear();
    }
}

E criamos uma classe BLL para cada entidade ou que agrupe entidades, desde que esse agrupamento faça sentido ao nível do negócio (exemplo Fatura / Linha_de_Fatura).

BookBLL.java:

package BLL;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import model.Book;

public class BookBLL {
   
    public static void create(Book book)

    {
        EntityManager em = BLLEntityManager.getEntityManager();
       
        em.getTransaction().begin();
        em.persist(book);
        em.getTransaction().commit();
       
        em.clear();
    }
   
    public static Book retrieve(int id)
    {
        EntityManager em = BLLEntityManager.getEntityManager();
        Query q = em.createNamedQuery("Book.findByBookid")

                      .setParameter("bookid", id);
        Book bk = (Book)q.getResultList().get(0);
        return bk;
    }

    public static void delete(Book book)
    {
        EntityManager em = BLLEntityManager.getEntityManager();
        em.getTransaction().begin();
        em.remove(book);
        em.getTransaction().commit();
        em.clear();   
    }
   
    public static void refreshEntity(Book bk)
    {
        EntityManager em = BLLEntityManager.getEntityManager();
        em.refresh(bk);
    }
}




Na camada acima (User Interface) podemos, usando a camada aqui construída, criar um BOOK e um AUTHOR associados (via BOOKAUTHOR) da seguinte forma:

   Author au = new Author();
   au.setName("Sousa");
   au.setSurname("Tavares");
   AuthorBLL.create(au);
      
   System.out.println(au.toString());
      
   Book b1 = new Book();
   b1.setTitle("Rio das Flores");
   b1.setEdition(2);
   b1.setDateedition(new Date(21, 07, 1901));
   b1.setAuthorSet(new HashSet<Author>());
   b1.getAuthorSet().add(au);
   BookBLL.create(b1);
Esta camada, isola a nossa aplicação (camada da UI) do JPA, permitindo a qualquer momento modificar a tecnologia usada no acesso à BD, sem ter que se alterar a UI.


Ler mais:

Sem comentários:

Enviar um comentário