Java Persistence Architecture Julio M. Faerman
Java Persistence Architecture
Julio M. Faerman
Mapeamento O-R
Java Persistence Architecture
# 2
Plain
Old
Java
Object
Plain
Old
Java
Object
Mapeamento Objeto-Relacional
Mapeamento Objeto-Relacional SGBDRSGBDR
AnotaçõesAnotações
XMLXML
ConvençõesConvenções
Java Persistence Architecture
Java Persistence Architecture
# 3
Object
Object
JPAjavax.persisten
ce
JPAjavax.persisten
ceMySQLMySQL
AnotaçõesAnotações
XMLXML
Hibernate, Toplink, OpenJPA,
EclipseLink
Hibernate, Toplink, OpenJPA,
EclipseLink
ConvençõesConvenções
ConvençõesConvenções
AnotaçõesAnotações
XMLXML
Java Persistence Architecture
Java Persistence Architecture
# 4
Artefato JPA Hibernate
Configuração persistence.xml hibernate.cfg.xmlHibernate.properties
Mapeamento Annotations
@javax.persistence @org.hibernate.annotations
Mapeamento XML orm.xml .hbm.xml
Queries JPQL HQL
API
Java Persistence Architecture
# 5
Ciclo de vida de entidades
Estado Contexto Persistente
ID Exemplo
Novo (new) Não Não ent = new Entidade();
Gerenciado (managed)
Sim Sim em.persist(ent);
Desvinculado (detached)
Não Sim em.close();
Removido (removed) Sim Sim em.remove(ent);
Java Persistence Architecture
# 6
Ciclo de vida de entidades
Java Persistence Architecture
# 7
META-INF/persistence.xml
Java Persistence Architecture
# 8
Entidades
• @Entity• Construtor sem
argumentos public ou protected
• Não final• Serializable*
Java Persistence Architecture
# 9
Chaves Primárias
• @Id• @GeneratedValue
– GenerationType.IDENTITY– GenerationType.SEQUENCE– GenerationType.TABLE– GenerationType.AUTO
• @SequenceGenerator
Java Persistence Architecture
# 10
PKs Compostas
• @EmbeddedID@Embeddable
class PkEntidade{
long pk1;
long pk2;
}
@Entity
Class Entidade{
@EmbeddedId
PkEntidade id;
}
• @IdClassclass PkEntidade{
long pk1;
long pk2;
}
@Entity
@IdClass(PkEntidade.class)
Class Entidade{
@Id pk1;
@Id pk2;
}
Java Persistence Architecture
# 11
Propriedades
• Primitivos e Wrappers• Numericos
– @Column(scale = 4, precision = 15)
• Temporais– @Temporal(TemporalType.TIMESTAMP)
• Enumerados– @Enumerated(EnumType.STRING)
• @Transient / transient
Java Persistence Architecture
# 12
Hello World JPA
Java Persistence Architecture
# 13
Relacionamentos @OneToOne
Java Persistence Architecture
# 14
PessoaPessoa Passaporte
Passaporte
PessoaPessoa Passaporte
Passaporte
PessoaPessoa Passaporte
Passaporte
pessoa.getPassaporte();pessoa.getPassaporte();
passaporte.getPessoa();passaporte.getPessoa();
passaporte.getPessoa();pessoa.getPassaporte();passaporte.getPessoa();pessoa.getPassaporte();
@OneToOne(mappedBy=“passaporte”)@OneToOne(mappedBy=“passaporte”)@OneToOne-Dono (owner) da associação- Tabela que vai ter a FK
@OneToOne-Dono (owner) da associação- Tabela que vai ter a FK
@OneToMany / @ManyToOne
Java Persistence Architecture
# 15
@ManyToOne
Departamento dpt = pessoa.getDepartamento();
@ManyToOne
Departamento dpt = pessoa.getDepartamento();
@OneToMany
List<Peca> peacas = carro.getPecas();
@OneToMany
List<Peca> peacas = carro.getPecas();
@OneToMany(cascade=CascadeType.ALL)@OneToMany(cascade=CascadeType.ALL)
O lado many sempre é owner e não declara mappedBy.O lado many sempre é owner e não declara mappedBy.
Relacionamentos @ManyToMany
Java Persistence Architecture
# 16
EscolaEscola PredioPredioN N
Set<Escola> escolas = predio.getEscolas();Set<Predio> predios = escola.getPredios();- Qualquer lado pode ser owner
Set<Escola> escolas = predio.getEscolas();Set<Predio> predios = escola.getPredios();- Qualquer lado pode ser owner
Herança
Java Persistence Architecture
# 17
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@Inheritance(strategy=InheritanceType.JOINED)
Pessoa
ID DTYPE Nome Cpf CNPJ
Pessoa
ID DTYPE Nome
PessoaFisica
ID Nome CPF
PessoaFisica
ID CPF
PessoaJuridica
ID CNPJ
PessoaJuridica
ID Nome CNPJ
Controle do esquema do banco
• @Table• @SecondaryTables• @Column• @JoinTable• @JoinColumn• @UniqueConstraint
Java Persistence Architecture
# 18
Consultas JPQL
• SELECTselect p from PessoaFisica as p where p.passaporte.numero = :numero
• UPDATEupdate Filial f set f.status = ’especial' where f.vendas > 1000000
• DELETEdelete from filial f where f.vendas = 0 AND f.funcionarios IS EMPTY
Java Persistence Architecture
# 19
Consultas Nomeadas
Java Persistence Architecture
# 20
@Entity
@NamedQueries({
@NamedQuery(name="pf.todas",query="select pf from PessoaFisica pf"),
@NamedQuery(name="pf.porPassaporte",
query="select p from PessoaFisica p where p.passaporte.numero = :numero")})
public class PessoaFisica extends Pessoa {…
@Entity
@NamedQueries({
@NamedQuery(name="pf.todas",query="select pf from PessoaFisica pf"),
@NamedQuery(name="pf.porPassaporte",
query="select p from PessoaFisica p where p.passaporte.numero = :numero")})
public class PessoaFisica extends Pessoa {…
Query query = em.createNamedQuery("pf.porPassaporte");
query.setParameter("numero", "123456");
PessoaFisica p = (PessoaFisica) query.getSingleResult();
Query query = em.createNamedQuery("pf.porPassaporte");
query.setParameter("numero", "123456");
PessoaFisica p = (PessoaFisica) query.getSingleResult();
Consultas Nativas (SQL)@SqlResultSetMapping( name="OrderResults", entities={ @EntityResult( entityClass=Order.class, fields={ @FieldResult(name="id", column="order_id"), @FieldResult(name="quantity",
column="order_quantity"), @FieldResult(name="item", column="order_item") } ), @EntityResult( entityClass=Item.class, fields={ @FieldResult(name="id", column="item_id"), @FieldResult(name="name",
column="item_name"), })})
Java Persistence Architecture
# 21
@Entitypublic class Order { @Id protected int id; protected long quantity; @ManyToOne protected Item item; ...}..em.createNativeQuery(“select * from Order”,”OrderResults”);
orm.xml (JSR 220, chap. 10)<?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
version="1.0">
<description>JPOX JPA tutorial</description>
<package>org.jpox.tutorial.jpa</package>
<entity class="org.jpox.samples.metadata.store.Product" name="Product">
<table name="JPA_PRODUCTS"/>
<attributes>
<id name="id">
<generated-value strategy="TABLE"/>
</id>
<basic name="name">
<column name="PRODUCT_NAME" length="100"/>
</basic>
<basic name="description">
<column length="255"/>
</basic>
</attributes>
</entity>
</entity-mappings>
Java Persistence Architecture
# 22
hbm.xml<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="events.Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native"/>
</id>
<property name="date" type="timestamp" column="EVENT_DATE"/>
<property name="title"/>
</class>
</hibernate-mapping>
Java Persistence Architecture
# 23
http://www.hibernate.org/hib_docs/reference/en/html/
Persistencia completa usando JPA
Java Persistence Architecture
# 24
Java Persistence Architecture
# 25
Dúvidas ?