JPA Marco Antonio Software Architect Agosto - 2008 Java Persistence API • Framework utilizado na camada de persistência para o desenvolvedor ter mais produtividade. • JPA define um caminho para mapear POJO’s para um banco de dados. POJO’s são chamados beans de entidade, pois têm uma tabela correspondente no BD. Bibliotecas • Ao lado você pode conferir as lib’s necessárias para utilizar o JPA hibernate.cfg.xml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property> <property name="connection.driver_class">org.postgresql.Driver</property> <property name="connection.url">jdbc:postgresql://localhost:5432/SCA</property> <property name="connection.username">postgres</property> <property name="connection.password">postgres</property> <property name="show_sql">true</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.cglib.use_reflection_optimizer" /> </session-factory> </hibernate-configuration> hibernate.cfg.xml • Essa nova versão do arquivo de configuração elimina a necessidade do hibernate.properties. • Todas as propriedades de conexão devem ficar aqui. • Deve estar no diretório META-INF EmpresaAerea package net.sca.entidades; import javax.persistence.*; /** * Essa classe representa uma Empresa Aérea no Domínio * Sistema de Controle Aéreo * @category A categoria dessa classe é domínio * @author T313120 * */ @Entity public class EmpresaAerea { private Long id; private String nomeFantasia; private String razaoSocial; EmpresaAerea @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column public String getNomeFantasia() { return nomeFantasia; } EmpresaAerea public void setNomeFantasia(String nomeFantasia) { this.nomeFantasia = nomeFantasia; } @Column public String getRazaoSocial() { return razaoSocial; } public void setRazaoSocial(String razaoSocial) { this.razaoSocial = razaoSocial; } } persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0“ 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/per...0.xsd"> <persistence-unit name="sca-pu" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> <property name="hibernate.ejb.cfgfile“ value="/META-INF/hibernate.cfg.xml" /> </properties> </persistence-unit> </persistence> persistence.xml • Esse arquivo fica no diretório src/META-INF. • Estamos configurando o JPA para trabalhar com o hibernate. Classes genéricas • DAO que realiza diversas tarefas da persistência. • A principal vantagem é que diminui sensivelmente a quantidade de código dos DAO’s específicos. • Com a utilização de genéricos, conseguimos especializar com eficiência todos os DAO’s do sistema. DAOGenericoJPA package net.sca.persistencia; import java.lang.reflect.*; import java.util.*; import javax.persistence.*; public class DAOGenericoJPA<T> { private EntityManager em; private EntityManagerFactory emf; public DAOGenericoJPA() { emf = Persistence.createEntityManagerFactory("sca-pu", new HashMap()); em = emf.createEntityManager(); } @SuppressWarnings("unchecked") protected Class<T> getClasse() { Class<T> classe = null; ParameterizedType pt = (ParameterizedType) ((Class<?>) getClass()) .getGenericSuperclass(); classe = (Class<T>) pt.getActualTypeArguments()[0]; return classe; } DAOGenericoJPA public void inserir(T objeto) { em.getTransaction().begin(); em.persist(objeto); em.getTransaction().commit(); } public void atualizar(T objeto) { em.getTransaction().begin(); em.persist(objeto); em.getTransaction().commit(); } public T consultarPeloId(Long id) { return em.find(getClasse(), id); } DAOGenericoJPA public List<T> consultarTodos() { String sql = "SELECT C FROM " + getClasse().getName() + " C "; return em.createQuery(sql).getResultList(); } //A classe de entidade deve ter o findAll public List consultarTodosNamedQuery() { return em.createNamedQuery("findAll").getResultList(); } public void excluir(T objeto) { em.getTransaction().begin(); em.remove(objeto); em.getTransaction().commit(); } } DAOEmpresaAerea package net.sca.persistencia; import net.sca.entidades.*; public class DAOEmpresaAerea extends DAOGenericoJPA<EmpresaAerea> { } TesteInsert package net.sca.entidades.teste; import net.sca.entidades.*; import net.sca.persistencia.*; public class TesteInsertEmpresa { public static void main(String[] args) { EmpresaAerea e = new EmpresaAerea(); DAOEmpresaAerea dao = new DAOEmpresaAerea(); e.setNomeFantasia("TAM"); e.setRazaoSocial("Transporte Aereo Marilia"); dao.inserir(e); } } TesteLoad package net.sca.entidades.teste; import java.util.*; import net.sca.entidades.*; import net.sca.persistencia.*; public class TesteLoad { public static void main(String[] args) { DAOEmpresaAerea d = new DAOEmpresaAerea(); List<EmpresaAerea> lista = d.consultarTodos(); for (EmpresaAerea ea : lista) { System.out.println(ea.getId()); System.out.println(ea.getNomeFantasia()); } } } Aeronave package net.sca.entidades; import javax.persistence.*; @Entity public class Aeronave { private Long id; private EmpresaAerea empresaAerea; private String modelo; private Integer quantidadeDeAssentos; @ManyToOne public EmpresaAerea getEmpresaAerea() { return empresaAerea; } public void setEmpresaAerea(EmpresaAerea empresaAerea) { this.empresaAerea = empresaAerea; } Aeronave @Column public String getModelo() { return modelo; } public void setModelo(String modelo) { this.modelo = modelo; } @Column public Integer getQuantidadeDeAssentos() { return quantidadeDeAssentos; } public void setQuantidadeDeAssentos(Integer quantidadeDeAssentos) { this.quantidadeDeAssentos = quantidadeDeAssentos; } @Id @GeneratedValue(strategy=GenerationType.AUTO) public Long getId() { return id; } public void setId(Long id) { this.id = id; } }