Você está na página 1de 28

Usando JPA Annotations

2010 - SBJ 2
Seguindo os padres da JPA cada entidade DEVE
atender os requisitos:
Ser anotada coma anotao @Entity.
Deve ter um construtor sem argumentos, pblico ou protegido.
No pode ser declarada final. Nenhum mtodo ou varivel de
instncia pode ser declarada como final.
Variveis de instncia persistentes no devem ser declaradas
pblicas e s podem ser acessadas pelos mtodos da classe.

2010 - SBJ 3
Como anotar a entidade
import javax.persistence.Entity;

@Entity public class Aluno
{

}
2010 - SBJ 4
2010 - SBJ 5
Existem 3 estratgias de mapeamento de
polimorfismo

Uma tabela para toda a hierarquia de classes

Uma tabela por classe concreta

Uma tabela por subclasse

F
l
e
x
i
b
i
l
i
d
a
d
e

D
e
s
e
m
p
e
n
h
o

2010 - SBJ 6
Uma Entidade mapeada com a anotao
@Entity
Pode ser definido um nome para a tabela do banco de dados atravs do
atributo name da anotao.
Um objeto que no uma entidade mas que tem
atributos persistentes ou informaes de mapeamento
deve ser mapeado com a anotao
@MappedSuperclass
Objetos mapeados com a anotao
@MappedSuperclass no podem ser pesquisados no
banco, ou seja, no existe uma tabela para aquele
objeto.
A anotao @MappedSuperclass utilizada para
hierarquias de objetos.


2010 - SBJ 7
Entidades que extendem no-Entidades ao serem
salvas, ignoram os dados da superclasse, a no
ser que a superclasse utilize a anotao
@MappedSuperclass
Ou seja, os dados da superclasse so transientes
e nunca sero persistentes.

2010 - SBJ 8
Uma tabela para toda a hierarquia de classes
Toda a hierarquia de classes representada por uma nica
tabela no banco de dados
Propriedades de uma subclasse especfica no podem ser
anotadas com a anotao @NotNull
Utiliza a anotao @DiscriminatorColumn para identificar a
instncia
2010 - SBJ 9
Uma tabela para toda a hierarquia de classe

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name=TYPE",
discriminatorType=DiscriminatorType.STRING)
public class Person { }
@Entity
@DiscriminatorValue(EMP")
public class Employee { }
@Entity
@DiscriminatorValue(STU")
public class Student { }
2010 - SBJ 10
Uma tabela para toda a hierarquia de classe:
@Inheritance e @DiscriminatorColumn s devem ser
utilizados no topo da hierarquia.
Caso no seja informado um name para o
DiscriminatorType o default DTYPE
Caso no seja informado um valor para o
DiscriminatorValue o default o nome da entidade,
conforme definido na anotao @Entity.

2010 - SBJ 11
Uma tabela por classe concreta
Cada classe concreta ser armazenada em uma
tabela distinta

2010 - SBJ 12
Uma tabela por classe concreta
A classe abstrata Person no mapeada
As sub-classes so mapeadas como uma classe qualquer

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Person { }
@Entity
public class Student extends Person { }
@Entity
public class Employee extends Person { }
2010 - SBJ 13
Uma tabela por classe concreta
Cada classe ser armazenada em uma tabela
Estratgia mais orientada objeto
Necessita de mais joins entre tabelas para recuperar
dados.
No suporta muito bem associaes polimrficas.

2010 - SBJ 14
Uma tabela por classe

2010 - SBJ 15
Uma tabela por classe
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Person { }
@Entity
public class Employee { }
@Entity
@PrimaryKeyJoinColumn(name=Person_ID")
public class Student { }
2010 - SBJ 16
Uma tabela por classe
Cada classe ser armazenada em uma tabela,
inclusive a classe pai, sendo ela abstrata ou no.
Necessita de um nico join para recuperar os dados.
Pode impactar no desempenho de uma aplicao
devido ao nmero de joins que podem ser feitos em
uma hierarquia completa.

2010 - SBJ 17
A primeira estratgia a mais simples mas restringe a utilizao de
not-null
Utilizado quando a principal diferena entre as diferentes sub-
classes seu comportamento, possuindo quase o mesmo
conjunto de propriedades
A segunda resolve o problema do not-null e da diferena entre o
conjunto de propriedades
Mas apresenta problema com associao polimrfica
A terceira a mais flexvel
Permite associaes com classes abstratas
Mas necessita de mais joins para recuperar dados
2010 - SBJ 18
A anotao @Id define o identificador nico da
classe
Toda entidade deve declarar um identificador
obrigatoriamente
A anotao @GeneratedValue utilizada para
definir a forma com que o id ser gerado.

@Id
@GeneratedValue (strategy=GenerationType.AUTO)
public Long getId(){}

2010 - SBJ 19
Se preferir, toda entidade pode ser herdeira de um
ObjetoPersistente, que contm o Identificador
@MappedSuperclass public abstract class ObjetoPersistente
implements Comparable<Object>
{
private Long id;

@Id @GeneratedValue public final Long getId()
@Entity public final class Usurio extends ObjetoPersistente
2010 - SBJ 20
Tipos de associaes:
1 1
1 N (composio)
1 N
N - N
2010 - SBJ 21




A entidade que possui a chave estrangeira
responsvel pela associao (a associao
persistida quando o objeto persistido).

Pessoa Endereo
1 1 1 1
+endereco +pessoa
@OneToOne
@JoinColumn
public Endereo getEndereco(){}
@OneToOne(mappedBy=endereco)
public Pessoa getPessoa(){}
2010 - SBJ 22
Uma tabela criada com o nome de
PessoaEndereco e em cada linha armazenar o id
da Pessoa e o id do Endereo nas colunas
pessoa_fk e endereco_fk,respectivamente.
Pessoa Endereo
1 1 1 1
+endereco +pessoa
@OneToOne (cascade=CascadeType.ALL)
@JoinTable(name=PessoaEndereco",
joinColumns = @JoinColumn(name =
pessoa_fk"),
inverseJoinColumns = @JoinColumn(name
= endereco_fk") )
public Endereo getEndereco(){}
@OneToOne(mappedBy=endereco)
public Pessoa getPessoa(){}
2010 - SBJ 23






Cuidado com o nome das chaves, eles so os responsveis por
tornar a associao bidirecional
As opes de cascade devem ser feitas de acordo com o tipo de
associao

@OneToMany(mappedBy=responsavel)
public Collection getDependetes(){}
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn
@org.hibernate.annotations.Cascade(value =
org.hibernate.annotations.CascadeType.
DELETE_ORPHAN)
public Pessoa getResponsavel(){}
2010 - SBJ 24







Tambm possvel fazer o mapeamento ManyToOne e
OneToMany utilizando uma tabela secundria.
O comportamento o mesmo do mapeamento OneToOne
com tabela secundria.

@OneToMany
@JoinTable(name=Pessoa_Dependente",
joinColumns = @JoinColumn(name =
pessoa_id"), inverseJoinColumns =
@JoinColumn(name =dependente_id") )
public Collection getDependetes(){}
@Entity
public class Dependente
{

//No existe o atributo
pessoa
...
}
Pessoa Dependente
0..* 1 0..* 1
+dependentes +responsavel
2010 - SBJ 25



Em associaes 1 N SEMPRE o lado N
comandar a associao
A associao persistida quando Dependente for
persistido.
Esta regra uma boa prtica, pois otimizada e
em geral executar apenas uma ao via cascade
ao invs de N.
@OneToMany(mappedBy=responsavel")
public Collection getDependetes(){}
@ManyToOne
@JoinColumn(name=PESSOA_DEP")
public Pessoa getResponsavel(){}
Pessoa Dependente
0..* 1 0..* 1
+dependentes +responsavel
2010 - SBJ 26




Em mapeamento many-to-many importante utilizar
o mappedBy para indicar qual lado manda na
relao.
Cascade para deleo deve ser utilizado com
cuidado, j que uma entidade com diversas
associaes pode ser apagada quando somente um
das entidades associadas for apagada.
@ManyToMany(mappedBy=pessoas")
public Collection getFuncoes(){}
@ManyToMany(cascade = {
CascadeType.PERSIST,
CascadeType.MERGE })
@JoinTable
public Pessoa getPessoas(){}
Pessoa
Funo
0..* 0..* 0..* 0..*
+funcoes +pessoas
2010 - SBJ 27
Eager: Utiliza um outer join para recuperar os objetos
associados quando o objeto base carregado.
Lazy: Carrega os objetos associados somente quando
eles forem utilizados pelo objeto base.

Relacionamentos OneToMany e ManyToMany tm
por default o tipo de recuperao Lazy, enquanto os
relacionamentos OneToOne e ManyToOne tem o tipo
de recuperao Eager.

@ManyToMany (fetch=FetchType.EAGER)
2010 - SBJ 28
Criar um novo projeto, configurar o Hibernate e
mapear um modelo de Entidades.

Você também pode gostar