Escolar Documentos
Profissional Documentos
Cultura Documentos
Caio Nakashima
caio.nakashima@mds.gov.br
caionakashima@gmail.com
Classe pessoa
import java.util.Calendar;
public class Pessoa {
private Long id;
private Calendar dataNascimento;
private String nome;
private char
sexo;
/** Creates a new instance of Pessoa */
public Pessoa() {}
public Long getId() {
return id;
}
private void setId(Long pId) {
this.id = pId;
}
public Calendar getDataNascimento() {
return dataNascimento;
}
public void setDataNascimento (Calendar pData){
this.dataNascimento = pData;
}
// ... Mtodos get e set
}
column="PES_DATANASC"/>
<mapping resource="Event.hbm.xml"/>
<mapping resource="Pessoa.hbm.xml"/>
Para pensar
Antes de mapear esta associao, uma pequena
reflexo.
Esta uma associao unidirecional.
Pode-se criar outra coleo na classe Event, se
desejar navegar de forma bi-direcional,
Event.getParticipants().
Esta escolha de projeto fica a cargo do projetista,
que claro nesta discusso de multiplicidade da
associao, uma associao de muitos para muitos.
column="PES_DATANASC"/>
Tipos de Mapeamento
Hibernate suporta todos os tipos de mapeamento de
colees, um <set> o mais comum.
Para uma associao de muitos-para-muitos (ou uma
relaes entre entidades n:m), uma associao entre tabelas
necessria.
Cada linha desta tabela representa uma ligao entre uma
pessoa e um evento.
O nome da tabela configurado com o atributo da tabela de
um conjunto de elementos.
O identificador no nome da coluna em uma associao, para
o lado da pessoa definido com o elemento <key>, o nome
da coluna para o lado do evento com o atriburo coluna de
<many-to-many>.
necessrio informar o Hibernate a classe de objetos na
coleo (a classe de outro lado da referncia).
10
Mapeamento do Esquema
Events
event_id (PK)
event_date
title
Pessoa-Event
event_id
pes_id
Pessoa
pes_id
nome
sexo
datanasc
11
load() X get()
http://forum.hibernate.org/viewtopic.php?p=2387456
O mtodo load() mais antigo que o mtodo
get().
Se o mtodo load() no encontrar o objeto no cache
ou banco de dados uma exceo gerada.
O mtodo load() nunca retorna NULL. O mtodo
get() retorna NULL se o objeto no for encontrado.
Depois de carregar uma Pessoa (pessoa) e um
Evento (event), adiciona-se o evento para a
pessoa.
No existe comando explcito de UPDATE() ou
SAVE().
Persistncia
Pode-se carregar um pessoa ou evento para uma
diferente unidade de trabalho.
Pode-se modificar um objeto fora de uma seo,
quando no est em estado de persistncia (se tiver
sido persistido antes da seo ser chamada).
15
Associao
O exemplo apresentado foi de uma associao entre duas
classes com mesmo grau de importncia, duas entidades.
Existem outras classes e tipos que podem ser classificados
como menos importantes.
Denomina-se estas classes do tipo valores (value types) e
suas instncias dependem de uma entidade em particular.
As instncias destes tipos no possuem sua prpria
entidade, nem so divididos entre entidades.
Os tipos de valores no podem ser encontrado somente no
JDK, mas podem tambm ser escritos dependentes da
classe, Endereo ou Saldo, etc.
Hibernate considera todos os tipos do JDK como tipo de valores.
16
Coleo de valores
Adiciona-se uma coleo de tipos de valores para uma
entidade Pessoa.
Deseja-se armazenar endereo de email, assim o tipo
utilizado String e a coleo novamente um Set.
private Set email = new HashSet();
public Set getEmail () {
return email;
}
public void setEmail (Set email) {
this.email = email;
}
Mapeamento
<set name="email" table=PESSOA_EMAIL">
<key column="PES_ID"/>
<element type="string" column="EMAIL"/>
</set>
17
Pessoa-evento
event_id
pess_id
Pessoa
pes_id
nome
datanasc
sexo
Pessoa_email
pess_id
email
19
20
Associao Bi direcional
O exemplo de associao bi-direcional ser entre
pessoa (Pessoa) e trabalho no evento.
O esquema do banco de dados no muda, ainda
existir a multiplicidade de muitos-para-muitos.
Um banco de dados mais flexvel que uma
linguagem de programao distribuda
No necessita nada como uma direo de navegao
Dados podem ser visualizados e recuperados em
qualquer caminho possvel.
21
inverse
Esse atributo utilizado para que o Hibernate saiba
como tratar a associao entre duas tabelas.
Quando um lado da associao define o atributo
inverse como true, indica que a ligao do
relacionamento entre a associao ser de
responsabilidade do "outro lado" da associao.
Se o atributo inverse no for definido como true, o
Hibernate no tem como saber qual dos dois lados
foi atualizado, ou seja, vai sempre atualizar os dois
lados de uma vez, uma atualizao para cada
classe da relao, o que seria desnecessrio.
Caso contrrio, o Hibernate passa a saber de qual
lado fazer a atualizao e fazendo uma nica vez.
23
lazy
Considerando o problema:
quando se realiza uma consulta (select) em um objeto
Pessoa implica em serem feitos n (quantidade de emails
da Pessoa) outras consultas para buscar os seus emails.
Mapeamento n-1
<many-to-one name="propertyName"
class="ClassName" column="column_name"
fetch="join|select" update="true|false" lazy="true|
false"
insert="true|false" cascade="all|none|save-update|
delete />
25
26
cascade
indica com que ao em cascata o relacionamento ser tratado
none: associao ignorada;
save-update:os objetos associados vo ser inseridos ou
atualizados automaticamente quando o objeto "pai" for
inserido ou atualizado;
delete: os objetos associados ao objeto "pai" vo ser
deletados;
all: juno de delete e save-update;
all-delete-orphan: o mesmo que all, mas o Hibernate deleta
qualquer objeto que tiver sido retirado da associao;
delete-orphan: se o objeto no fizer mais parte da
associao, ele removido.
27
28
Exerccio
Considerando do Diagrama da prxima transparncia e
utilizando a camada de persistncia Hibernate elaborar um
conjunto de arquivos necessrios para criar as tabelas,
inserir, alterar, excluir e listar os registros das seguintes
entidades:
Entidade
Event
Pessoas
Pessoa_email
Pessoa_telefones
Criar
Sim
Sim
Sim
Sim
Inser.
Sim
Sim
Sim
Sim
Excl.
Sim
Sim
Sim
Sim
Alter.
Sim
Sim
Sim
Sim
Listar
+ pessoas
+ email + tel
+ pessoas
Palestras
Sim
Sim
Sim
Sim
+ pessoas
29
Exerccio
Pessoa
Events
1
n
Palestra
palestra_id
tema
titulo
event_id (PK)
event_date
title
n
n
1
pes_id
nome
datanasc
sexo
1
n
n
Pessoa_telefones
Pessoa_email
pess_id
telefone
Tipo (celular,
Residencial, etc.)
pess_id
email
30