JPA - Marco Reis

Propaganda
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;
}
}
Download