Application Server & EJB3 Wesley Gonçalves da Silva [email protected] http://balaprata.blogspot.com JPA – Java Persistence API Visão Geral JPA – O que é? Uma especificação Respeita o conceito básico do java com: Implementação De Referência Grupo Responsável: JCP Especificação: JSR 220 3 JPA – O que é? Sofreu fortes influências de frameworks criados pela comunidade: Hibernate, toplink, cocobase, iBats, ... Veio junto da especificação JEE5 e é um os maiores avanços da especificação como um todo: Alto grau de abstração Consegue ser de fato um framework NÃO tem como requisito JEE: POSSO usar no JSE! Comportamentos default É simples POJO´s, Annotations, Testes... 4 JPA – Elementos básicos Uma solução O/R deve ter 3 itens: 1) Forma facilitada para o mapeamento O-R; 2) Facilidade para o CRUD 3) Estrutura para consultas 5 JPA – Elementos básicos EntityManagerFactory e EntityManager META-INF/persistence.xml @Entity e @Id em POJO´s Interface Query (retornada por EntityManager.createQuery) Aplicação JPA Provedor JPA JDBC SGBD 6 JPA – Acabou? Existem uma série de itens da especificação para nos ajudar no desenvolvimento de nossas aplicações Mapeamento objeto-relacional – Classes e Atributos Consultas Callback Listeners Entre outros Contudo, a especificação também tem limitações... 7 JPA – Java Persistence API EntityManager (I) Qual o seu papel? É o coração da JPA: Ele gerencia o ciclo de vida das entidades É através dela que serão realizadas as operações de CRUD, consultas... Objeto Salvar Recuperar SQL Entity Manager SGBD-R Resultado 9 Exemplo de seus métodos Method Summary void persist(Object entity) Make an entity instance managed and persistent. <T> T find(Class<T> entityClass, Object primaryKey) Find by primary key. <T> T merge(T entity) Merge the state of the given entity into the current persistence context. void remove(Object entity) Remove the entity instance. Query createNamedQuery(String name) Create an instance of Query for executing a named query (in the Java Persistence query language or in native SQL). Query createQuery(String qlString) Create an instance of Query for executing a Java Persistence query language statement. void flush() Synchronize the persistence context to the underlying database. void refresh(Object entity) Refresh the state of the instance from the database, overwriting changes made to the entity, if 10 any. Ciclo de vida de entidades 11 Ciclo de vida de entidades Entidades Gerenciadas (managed) O EntityManager tem certeza de que os dados das entidades estão sincronizados com o banco de dados Um entidade torna-se gerenciada pelo EntityManager: persist(), merge(), refresh() 12 Ciclo de vida de entidades Entidades Separadas (detached) Entidades que não são mais gerenciadas pelo EntityManager, ou seja, não há garantia de sincronia com o banco de dados Ex.: Quando uma entidade é devolvida para a camada web, tipicamente ela está detached Instâncias de entidades tornam-se separadas quando são serializadas ou clonadas Um entidade torna-se detached pelo EntityManager: remove(), clear() - força entidades do contexto de persistência serem separadas 13 EntityManager fora do JEE : //obtém a instância de EntityManagerFactory e cria o EntityManger EntityManagerFactory emf = Persistence.createEntityManagerFactory(“puAplicacao”); EntityManager em = emf.createEntityManager(); try{ //cria a transação EntityTransaction et = em.getTransaction(); et.begin(); //inicia a transação em.persist(meuObjeto); //persiste - managed et.commit(); //encerra a transação }finally{ //libera os recursos em.close(); emf.close(); } 14 persistence.xml <?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_1_0.xsd" version="1.0"> <persistence-unit name=“puAplicacao" transaction-type="RESOURCE_LOCAL"> <class>br.com.Pessoa</class> <properties> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/> <property name="hibernate.connection.username" value="sa"/> <property name="hibernate.connection.password" value=""/> <property name="hibernate.connection.url" value="jdbc:hsqldb:hsql://localhost"/> <property name="hibernate.dialect“ value="org.hibernate.dialect.HSQLDialect"/> </properties> </persistence-unit> 15 </persistence> Exercícios 1) Cite os principais elementos da JPA e descrevaos brevemente. 2) Qual a sua opinião sobre o JPA gerenciar o ciclo de vida das entidades? 16 JPA – Java Persistence API Visão Geral