Documente Academic
Documente Profesional
Documente Cultură
Sumrio
1. Introduo.................................................................................................................2
2. Hibernate 3................................................................................................................3
3. Questes..................................................................................................................25
4. Respostas e comentrios.........................................................................................33
http://www.tiparaconcursos.net
Pgina 1 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
1. Introduo
O objetivo dessa aula preparar o aluno para as questes que envolvem o framework
Hibernate 3, cobrindo os conceitos e principais classe/interfaces que so cobradas nas provas. Para
isso, faremos uso de provas anteriores, analisando o tipo de entendimento que se espera do
candidato sobre essa tecnologia.
As questes, no geral, querem saber os conceitos sobre a tecnologia, quais as principais
funcionalidades e a responsabilidade de cada classe/interface do framework. Perceba que esse
texto no preparatrio para o uso profissional da ferramenta, estamos preocupados aqui em
mostrar o que exigido nos concursos.
A diferena entre essa abordagem terica e o uso prtico do Hibernate que no veremos
exemplos detalhados de implementao e otimizaes profissionais, pois esse nvel de dificuldade
no objetivo deste concurso. Aqui teremos uma viso geral da ferramenta dentro do que se
espera para essa prova especificamente.
http://www.tiparaconcursos.net
Pgina 2 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
2. Hibernate 3
O Hibernate uma ferramenta de mapeamento objeto/relacional para Java. Ele transforma
os dados tabulares de um banco de dados em um grafo de objetos definido pelo desenvolvedor.
Usando o Hibernate, o desenvolvedor se livra de escrever muito do cdigo de acesso a banco de
dados e de SQL que ele escreveria no usando a ferramenta, acelerando a velocidade do
desenvolvimento.
Mas o framework no uma boa opo para todos os tipos de aplicao. Sistemas que
fazem uso extensivo de stored procedures, triggers ou que implementam a maior parte da lgica
da aplicao no banco de dados, contando com um modelo de objetos pobre no vai se
beneficiar com o uso do Hibernate. Ele mais indicado para sistemas que contam com um modelo
rico, onde a maior parte da lgica de negcios fica na prpria aplicao Java, dependendo pouco
de funes especficas do banco de dados. O Hibernate foi escrito em Java, mas h uma verso
para .NET chamada NHibernate.
O Hibernate foi criado pelo programador Gavin King e surgiu da constatao que trabalhar
com software orientado a objetos e bases de dados relacionais tende a consumir muito tempo, j
que os paradigmas de desenvolvimento so diferentes. Da, surgiu a necessidade de criar uma
ferramenta intermediria que diminua essa diferena.
Segundo a documentao oficial do Hibernate, o programador no precisa ter grande
conhecimento de SQL para criar sistemas que acessam dados relacionais. Naturalmente, com esse
conhecimento possvel entender os conceitos mais rapidamente e com mais profundidade.
A principal funcionalidade do Hibernate mapear as classes Java para tabelas no banco de
dados relacional. Mais que isso, ele tem disponvel um mecanismo de recuperao de dados
bastante eficiente. O uso do Hibernate traz como principal consequncia a reduo do tempo
gasto com as tarefas de programao relacionadas com a persistncia dos dados, chegando a gerar
economia de tempo da ordem de 95% nas referidas tarefas.
Existem ferramentas para fazer a engenharia reversa e direta entre Hibernate e o banco de
http://www.tiparaconcursos.net
Pgina 3 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
dados, ou seja, voc pode criar as tabelas a partir das classes mapeadas e tambm pode criar as
classes mapeadas a partir do banco de dados. Na figura abaixo temos uma viso dos principais
componentes da arquitetura envolvida com o Hibernate.
Mapeamento de classes
A principal funcionalidade do Hibernate o mapeamento de classes Java para entidades de
banco de dados. Vamos considerar o exemplo de classe abaixo, que est no arquivo Pessoa.java.
package net.marcoreis.entidades;
http://www.tiparaconcursos.net
Pgina 4 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
import java.util.Date;
public class Pessoa {
private String nome;
private String telefone;
private Endereco endereco;
private Integer id;
private Date dataNascimento;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getTelefone() {
return telefone;
}
public void setTelefone(String telefone) {
this.telefone = telefone;
}
public Endereco getEndereco() {
return endereco;
}
http://www.tiparaconcursos.net
Pgina 5 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
package net.marcoreis.entidades;
public class Endereco {
private String bairro;
http://www.tiparaconcursos.net
Pgina 6 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
http://www.tiparaconcursos.net
Pgina 7 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
return numero;
}
public void setNumero(String numero) {
this.numero = numero;
}
}
Estas classes usam o padro JavaBean, e essa uma boa prtica quando se trabalha com
Java. Para todos os efeitos, vamos imaginar que voc sabe como criar os mtodos de acesso, bem
como os principais padres da linguagem.
H 2 formas de mapear classes: com arquivos xml e com anotaes. O Hibernate precisa
saber como carregar e armazenar os objetos, para isso precisamos do arquivo mapeado. A
estrutura bsica parecida com o que segue:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.tutorial.domain">
[...]
</hibernate-mapping>
http://www.tiparaconcursos.net
Pgina 8 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
<hibernate-mapping package="net.marcoreis.entidades">
<class name="Pessoa" table="Pessoa">
</class>
</hibernate-mapping>
<hibernate-mapping package="net.marcoreis.entidades">
<class name="Pessoa" table="Pessoa">
<id name="id" column="pessoa_id">
<generator class="native" />
</id>
</class>
</hibernate-mapping>
Os atributos devem ser mapeados e podem utilizar os padres do prprio banco de dados,
como no caso do nome e telefone, que usar o padro do banco de dados para String. Caso seja
necessrio, voc pode especificar outras propriedades no mapeamento para refinar o modelo,
como no caso da dataNascimento. Neste caso, o Hibernate vai usar o padro para String que est
definida no banco de dados utilizado. No caso do id, o Hibernate vai tentar usar a melhor
estratgia para criar a chave primria.
http://www.tiparaconcursos.net
Pgina 9 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
Veja que o atributo endereco deve ser mapeado com a tag many-to-one pois faz referncia
a uma classe do seu domnio. Segue o cdigo:
<hibernate-mapping package="net.marcoreis.entidades">
<class name="Pessoa" table="Pessoa">
<id name="id" column="pessoa_id">
<generator class="native" />
</id>
<property
name="dataNascimento"
type="timestamp"
column="data_nascimento" />
<property name="nome" />
<property name="telefone" />
<many-to-one name="endereco" />
</class>
</hibernate-mapping>
Salve esse arquivo no mesmo diretrio das classes de entidade com o nome de
Pessoa.hbm.xml. Este nome ser referenciado nas outras configuraes que sero feitos em
seguida.
O mesmo procedimento deve ser feito com a classe Endereco. Crie um arquivo
Endereco.hbm.xml no pacote das entidades, mapeando os atributos. Neste caso, no teremos o
relacionamento many-to-one, uma vez que Endereco no tem relacionamentos com outras classes
(neste nosso exemplo). Para todo atributo mapeado deve haver os mtodos de acesso (set/get).
http://www.tiparaconcursos.net
Pgina 10 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
Herana
O Hibernate suporte trs estratgias de herana:
Tabela nica por hierarquia de classes: uma nica tabela para toda a hierarquia de classes,
com todos os campos. Para a classe Pessoa e outras 2 subclasses PessoaFisica e
PessoaJuridica, o Hibernate ir gerar apenas 1 tabela Pessoa com os dados de Pessoa +
PessoaFisica + PessoaJuridica. A diviso entre os tipos feito atravs de um atributo
"discriminator".
Tabela por Subclasse: nessa estratgia ns teremos a Classe Pai e todas suas filhas geradas
no banco de dados fisicamente, sendo que em todas as classes filhas teremos uma chave
estrangeira que apontar para a classe pai. Isto , se tivermos 1 Classe Pessoa com 5
atributos, 1 Classe Pessoa Fsica com 10 atributos e 1 Classe Pessoa Jurdica com 15
atributos, o gerado ser: 1 tabela pessoa com 5 atributos, 1 tabela pessoa_fisica com 10
atributos e 1 tabela pessoa_juridica com 15 atributos.
Tabela por Classe Concreta: essa estratgia define que apenas as classes concretas geram
suas respectivas tabelas, ou seja, em nosso exemplo apenas pessoaFisica e pessoaJuridica
criaro tabelas, isso porque pessoa uma classe abstrata.
http://www.tiparaconcursos.net
Pgina 11 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
http://www.tiparaconcursos.net
Pgina 12 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://localhost/mydatabase
hibernate.connection.username = myuser
hibernate.connection.password = secret
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
http://www.tiparaconcursos.net
Pgina 13 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
Query (org.hibernate.Query): usa SQL ou HQL para recuperar dados e criar objetos.
Podemos atribuir parmetros, limitar o nmero de resultados e finalmente executar a
consulta.
O framework foi desenvolvido para uso corporativo, por isso, possvel integrar o
Hibernate na sua infraestrutura Java EE. Fazemos isso atravs desses pontos:
http://www.tiparaconcursos.net
Pgina 14 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
JMX deployment: Se voc usa um JMX servidor de aplicaes capaz (ex. Jboss AS), voc
pode fazer a instalao do Hibernate como um MBean controlado.
Destacado (Detached): um objeto foi persistente, mas sua sesso (Session) foi fechada. A
referncia para o objeto ainda existe e ele ainda pode ser alterado. Mais tarde, uma
instncia desse tipo pode ser atachada a um novo objeto Session e suas atualizaes
podem ento ser persistidas novamente.
http://www.tiparaconcursos.net
Pgina 15 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
O programador pode fazer a configurao do Hibernate via cdigo, sem usar o xml. Veja um
exemplo simples de configurao:
Configuration cfg = new Configuration()
.addResource("Item.hbm.xml")
.addResource("Bid.hbm.xml");
Logo abaixo voc tem um exemplo de configurao mais complexa, onde percebemos que
podemos fazer todo tipo de configurao dinamicamente na aplicao:
Dialetos
O Hibernate usa dialetos para descobrir as caractersticas especficas de cada banco de
dados, por isso, selecione corretamente a classe correspondente na propriedade hibernate.dialect.
O framework usa os padres dessa classe para algumas tarefas internas. Segue a lista de dialetos
disponveis:
DB2 - org.hibernate.dialect.DB2Dialect
http://www.tiparaconcursos.net
Pgina 16 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
PostgreSQL - org.hibernate.dialect.PostgreSQLDialect
MySQL5 - org.hibernate.dialect.MySQL5Dialect
Oracle 9i - org.hibernate.dialect.Oracle9iDialect
Sybase - org.hibernate.dialect.SybaseASE15Dialect
SAP DB - org.hibernate.dialect.SAPDBDialect
Informix - org.hibernate.dialect.InformixDialect
HypersonicSQL - org.hibernate.dialect.HSQLDialect
H2 Database - org.hibernate.dialect.H2Dialect
Ingres - org.hibernate.dialect.IngresDialect
Progress - org.hibernate.dialect.ProgressDialect
http://www.tiparaconcursos.net
Pgina 17 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
Interbase - org.hibernate.dialect.InterbaseDialect
Poinbase - org.hibernate.dialect.PointbaseDialect
FrontBase - org.hibernate.dialect.FrontbaseDialect
Firebird - org.hibernate.dialect.FirebirdDialect
Consultas
A linguagem de consulta do framework se chama Hibernate Query Language (HQL) e
orientada a objetos e entende conceitos como herana, polimorfismo e associao. Com exceo
de classes e propriedades, no case-sensitive. Voc pode usar Select ou sELECT e o resultado ser
o mesmo.
A sintaxe mais simples from net.marcoreis.entidades.Pessoa, ou em sua forma com
auto importao from Pessoa. possvel, e muitas vezes necessrio, usar alias nas consultas,
como em from Pessoa p. Tem suporte para inner join, left outer join, right outer join e full join.
Podemos fazer restries com a clusula where, como em from Pessoa where nome like
'marco%'. Se criar um alias, no esquea de us-lo: from Pessoa p where p.nome like 'marco%'.
Tem suporte seguintes funes agregadas:
count(*)
O uso do HQL no obrigatrio. possvel fazer consultas com SQL puro e com a interface
Criteria, como no exemplo:
http://www.tiparaconcursos.net
Pgina 18 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
Classe TesteDaPessoaSave
package net.marcoreis.entidades;
import java.util.*;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class TesteDaPessoaSave {
public static void main(String[] args) {
try {
1. SessionFactory fabrica = new Configuration().configure().buildSessionFactory();
2. Session sessao = fabrica.openSession();
3. Pessoa pessoa = new Pessoa();
4. pessoa.setNome("Marco Antonio");
5. pessoa.setEndereco("CNB 14 LOTE 10");
6. pessoa.setTelefone("33521134");
http://www.tiparaconcursos.net
Pgina 19 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
http://www.tiparaconcursos.net
Pgina 20 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
Classe TesteDaPessoaLoad
package net.marcoreis.entidades;
import org.hibernate.*;
import org.hibernate.cfg.*;
http://www.tiparaconcursos.net
Pgina 21 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
Classe TesteDaPessoaDelete
package net.marcoreis.entidades;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class TesteDaPessoaDelete {
public static void main(String[] args) {
1. SessionFactory fabrica = new Configuration().configure().buildSessionFactory();
2. Session sessao = fabrica.openSession();
3. Long id = new Long(5);
4. Pessoa pessoa = (Pessoa) sessao.load(Pessoa.class, id);
5. Transaction tx = sessao.beginTransaction();
6. sessao.delete(pessoa);
7. tx.commit();
}
}
http://www.tiparaconcursos.net
Pgina 22 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
Classe TesteDaPessoaUpdate
package net.marcoreis.entidades;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class TesteDaPessoaUpdate {
public static void main(String[] args) {
1. SessionFactory fabrica = new Configuration().configure().buildSessionFactory();
2. Session sessao = fabrica.openSession();
3. Pessoa pessoa = (Pessoa) sessao.load(Pessoa.class, new Long(6));
4. Transaction tx = sessao.beginTransaction();
5. pessoa.setEndereco("Novo Endereo");
6. sessao.update(pessoa);
7. tx.commit();
http://www.tiparaconcursos.net
Pgina 23 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
}
}
Obs: para atualizar uma pessoa, voc deve, primeiro, consult-la na base.
1, 2. configura a fbrica e abre a sesso com o banco.
3. recupera a pessoa com o ID igual a 6.
4. inicia a transao (obrigatria), pois um registro ser atualizado.
5. o valor do atributo modificado.
6. o objeto modificado na sesso.
7. os dados do registro no banco de dados so finalmente atualizados.
http://www.tiparaconcursos.net
Pgina 24 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
3. Questes
1) 2012/FCC/TRT - 11 Regio (AM)/Tcnico Judicirio - Tecnologia da Informao
No Hibernate,
a) SessionFactory um objeto de linha de execuo nica, compartilhado, que representa uma
unidade de trabalho em particular com o banco de dados (sesso). Com ele possvel criar,
remover, atualizar e recuperar objetos persistentes no banco de dados.
b) as interfaces responsveis por executar operaes de criao, deleo, consulta e atualizao no
banco de dados so EntityManagerFactory, EntityManager, EntityTransaction e QueryManager.
c) A interface Transaction utilizada para representar uma unidade indivisvel de uma operao de
manipulao de dados. O uso dessa interface em aplicaes que usam Hibernate obrigatrio.
d) Uma consulta a banco de dados pode ser escrita na prpria linguagem orientada para objetos
do Hibernate (HQL) ou em puro SQL.
e) Objetos transientes so objetos em que suas instncias esto associadas a um contexto
persistente, ou seja, tem uma identidade de banco de dados.
Pgina 25 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
e) o desenvolvedor pode acessar diretamente uma tabela de banco de dados, bastando, para isso,
abrir uma conexo.
Pgina 26 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
http://www.tiparaconcursos.net
Pgina 27 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
d) A Java Persistence API (JPA) implementa o Hibernate, que parte do Enterprise JavaBeans 4.0.
e) Em uma aplicao criada com Hibernate, para cada classe de persistncia necessrio criar um
arquivo de mapeamento XML que deve ser salvo obrigatoriamente com o nome da classe seguido
pelo sufixo .map.xml.
Pgina 28 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
Pgina 29 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
de dados, o que diminui a distncia entre o desenvolvimento das regras de negcio e o banco de
dados.
Pgina 30 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
I. o cdigo exibe a estrutura bsica de um arquivo XML de mapeamento que indica ao Hibernate
como carregar e gravar os objetos de uma classe de persistncia;
II. as declaraes de mapeamento esto circunscritas entre as tags </hibernate-mapping>; ;
III. o elemento < id > a declarao de uma propriedade identificadora de tabela (chave-primria)
e o atributo column="ID_PESSOA" indica qual o campo na tabela ao qual ele est ligado.
correto o que consta em
a) I, apenas.
b) I e II, apenas.
c) I, II e III.
d) II e III, apenas.
e) I e III, apenas.
Pgina 31 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
http://www.tiparaconcursos.net
Pgina 32 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
4. Respostas e comentrios
1) Resposta: d.
A alternativa correta a letra D. As demais esto erradas porque:
a) essa a definio de Session.
b) no faz parte do Hibernate, e sim do JPA.
c) no obrigatrio usar Transaction em toda a aplicao.
d) correto.
e) essa a definio de objeto persistente.
2) Resposta: c.
a) segundo o gabarito oficial, esta alternativa est errada, mas o Hibernate suporta anotaes.
Acontece que essas anotaes fazem parte da especificao JPA, no do Hibernate.
b) errado. O programador no precisa obrigatoriamente usar nenhuma instruo SQL.
c) certo.
d) errado. Os arquivos so em XML e no em HTML.
e) segundo o gabarito oficial, est errado. Mas possvel abrir uma conexo direta JDBC atravs de
um wrapper.
3) Resposta: a.
No pode errar esse tipo de questo: Hibernate um framework para mapeamento objeto
relacional.
http://www.tiparaconcursos.net
Pgina 33 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
4) Resposta: e.
Cada alternativa representa uma tecnologia Java conforme indicado abaixo:
a) JSF
b) EJB
c) EJB
d) JSP
d) Hibernate
5) Resposta: b.
Questo bastante simples, que mostra outra forma de definir o Hibernate.
6) Resposta: a.
b) errado. exatamente o inverso do que diz essa alternativa. Quanto menos componentes
prprios de banco forem usados, mais fcil a utilizao do modelo de dados com Hibernate.
c) errado. O programador pode usar HQL, Criteria e SQL puro.
d) errado. Hibernate implementa a especificao JPA.
e) segundo o gabarito, est errado. Mas o sufixo no obrigatrio. H conflito entre a
documentao oficial e o entendimento da banca.
7) Resposta: d.
http://www.tiparaconcursos.net
Pgina 34 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
Destacado (Detached): um objeto foi persistente, mas sua sesso (Session) foi fechada. A
referncia para o objeto ainda existe e ele ainda pode ser alterado. Mais tarde, uma
instncia desse tipo pode ser atachada a um novo objeto Session e suas atualizaes
podem ento ser persistidas novamente.
8) Resposta: certo.
De acordo com os exemplos vistos, no obrigatrio o uso da herana para criar classes
persistentes no Hibernate. O mapeamento pode ser feito via xml ou anotao JPA.
9) Resposta: e.
A linguagem de consulta do framework se chama Hibernate Query Language (HQL) e
orientada a objetos e entende conceitos como herana, polimorfismo e associao. Com exceo
de classes e propriedades, no case-sensitive. Voc pode usar Select ou sELECT e o resultado ser
o mesmo.
Pgina 35 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
objetos.
12) Resposta: a.
O Hibernate suporte 3 estratgias de herana:
Tabela nica por hierarquia de classes: uma nica tabela para toda a hierarquia de classes,
com todos os campos.
Tabela por Subclasse: nessa estratgia ns teremos a Classe Pai e todas suas filhas geradas
no banco de dados fisicamente, sendo que em todas as classes filhas teremos uma chave
estrangeira que apontar para a classe pai.
Tabela por Classe Concreta: essa estratgia define que apenas as classes concretas geram
suas respectivas tabelas.
14) Resposta: d.
A linguagem de consulta do framework se chama Hibernate Query Language (HQL)
15) Resposta: c.
Todas as alternativas esto corretas. Este um arquivo tpico para mapeamento do
Hibernate, as declaraes dos atributos de mapeamento esto entre as tags do hibernatemappings e id o atributo identificador do objeto.
http://www.tiparaconcursos.net
Pgina 36 de 37
Hibernate 3
Aula 00 Teoria e Exerccios
Prof. Marco Reis
16) Resposta: a.
Os mapeamentos ficam no SessionFactory, a conversao feita atravs da Session e a
abstrao do DriverManager o ConnectionProvider.
http://www.tiparaconcursos.net
Pgina 37 de 37