Escolar Documentos
Profissional Documentos
Cultura Documentos
Hibernate
● Persistência de Objetos
– O que é?
– Por que mapeamento O/R?
– Dificuldades Tradicionais do mapeamento O/R
● Utilizando o Hibernate para o mapeamento O/R
http://www.usiinformatica.com.br http://www.rsjug.org
O que é persistir um objeto?
● Uma aplicação java é composta de objetos
● São utilizados objetos também para
representar os dados
● Para que estes dados continuem existido
entre diferentes execuções da aplicação
estes objetos de dados precisam ser
duráveis
● Navegar na arvore de objetos é mais fácil do
que fazer uma consulta SQL na maioria das
http://www.usiinformatica.com.br http://www.rsjug.org
vezes
Por que mapeamento OR?
● A maneira padrão de armazenar dados em todas
as empresas no mundo é um banco de dados
Relacional
● Os bancos de dados orientados a objetos não
estão tão desenvolvidos quanto os bancos de
dados relacionais
● Muitos aplicativos desenvolvidos em linguagens
orientadas a objetos precisam se comunicar com
aplicativos já existentes, e interagir com os dados
destes aplicativos é uma maneira bastante
funcional para isto
http://www.usiinformatica.com.br http://www.rsjug.org
Dificuldades tradicionais no
mapeamento O/R
● O modelo de representação dos dados em
um banco relacional não é compatível com a
representação direta de uma hierarquia de
objetos
● Os tipos de dados utilizados em uma
linguagem orientada a objetos não são os
mesmos existentes em um banco de dados
● é necessário transformar os objetos para
tabelas e as tabelas para objetos novamente
http://www.usiinformatica.com.br http://www.rsjug.org
Utilizando o Hibernate para o
mapeamento O/R
● O Hibernate é uma ótima solução open
source para mapeamento Objeto Relacional,
além de ser a solução mais utilizada hoje em
dia.
● Ele trás uma grande Flexibilidade e poder
para a aplicação, contando com a linguagem
de consulta HQL e aceitando, em suas
últimas versões, a utilização de SQL
mesclado a esta linguagem de consultas
http://www.usiinformatica.com.br http://www.rsjug.org
Esquecendo o banco de dados
● Um sistema orientado a objetos, funciona de maneira
muito melhor, quando todo o sistema é orientado a
objetos, incluíndo os dados do sistema.
● mesmo o conceito de Value Objects violando 90% das
leis da orientação a objetos, continua muito mais fácil o
lógico de trabalhar do que consultas isoladas ao banco
de dados trasendo conjuntos de dados sem uma
informação completa.
● Isolando os dados em um modelo de objetos, facilita o
processo de alteração no schema do banco de dados,
já que o resto da aplicação não precisa ficar sabendo
http://www.usiinformatica.com.br
que este ocorreu. http://www.rsjug.org
Persistindo Objetos Simples
● Qualquer objeto persistido <class name="Item" lazy="true"
table="items">
utilizando o Hibernate, precisa
de um arquivo de <id name="nome">
http://www.usiinformatica.com.br
pode ser transformado em um
http://www.rsjug.org
blob.
Tipos de dados personalizados
● Além dos tipos de dados incluídos de fábrica, as vezes precisamos de um tipo
composto, ou complexo, estes podem vir em quatro sabores:
http://www.usiinformatica.com.br http://www.rsjug.org
Herança e persistência
● Como uma boa engine de mapeamento O/R o hibernate
trás suporte para herança e polimorfismo para consultas e
persistência dos dados.
● para que uma classe suporte polimorfismo no seu
mapeamento deve ser utilizado o elemento: <discriminator
column="subclass" type="character"/> desta maneira o
hibernate pode identificar novamente o tipo de dados
daquela linha quando for ler novamente o objeto ali
armazenado.
● Durante uma consulta ou armazenamento de dados no
entanto, o polimorfismo é automático, sem a necessidade
de nenhuma sintaxe especial.
http://www.usiinformatica.com.br http://www.rsjug.org
Persistindo coleções
● O Hibernate prove também suporte a
persistência de coleções, para relações one-
to-many e many-to-many.
● Arrays também são suportados, e são a
única opção para a persistência de coleções
primitivas.
● Como cada tipo de coleção tem suas
características, e o Java não da suporte a
coleções tipadas ainda, discutiremos a
http://www.usiinformatica.com.br
seguir o mapeamento dehttp://www.rsjug.org
coleções do
Persistindo um array
● Arrays de tipos Objeto ou <array name="foos"
primitivo são suportados table="BAR_FOOS"
pelo hibernate. cascade="all">
http://www.usiinformatica.com.br http://www.rsjug.org
Persistindo um List
<list name="carComponents"
● O contrato da table="car_components">
<composite-element
uma lista, é uma class="org.hibernate.car.CarComponent"
>
coleção de objetos
<property name="price" type="float"/>
que podem se
<property name="type"
repetir e ficam type="org.hibernate.car.ComponentType"
/>
armazenados de <property name="serialNumber"
maneira posicional. column="serial_no" type="string"/>
</composite-element>
http://www.usiinformatica.com.br
</list> http://www.rsjug.org
Persistindo um Set
<set name="names"
● O contrato da ●
table="NAMES">
interface java.util.Set ● <key column="GROUPID"/>
especifica que esta ● <element column="NAME"
coleção não contem type="string"/>
é bastante útil em
uma grande
quantidade de
situações.
http://www.usiinformatica.com.br http://www.rsjug.org
Persistindo um BAG
● O Collection framework do ● <bag name="sizes"
java, não tem uma interface table="SIZES" order-
Bag, mas a idéia desta by="SIZE ASC">
coleção é bem parecida
● <key
com um List.
column="OWNER"/>
● O Bag é uma lista que
● <element column="SIZE"
pode conter elementos
type="integer"/>
repetidos, mas diferente de
uma List ela não mantem a ● </bag>
ordem dos itens, tendo a
vantagem de poder ser
ordenada a vontade na
hora de uma consulta.
http://www.usiinformatica.com.br http://www.rsjug.org
Persistindo um Map
● Muitas vezes, é útil salvar ● <map name="holidays"
uma coleção de objetos na table="holidays"
forma de um java.util.Map, schema="dbo" order-
desta forma podendo by="hol_name asc">
recuperar o valor destes ● <key column="id"/>
objetos pelo valor da chave
● <index column="hol_name"
associada a ele. type="string"/>
● Existem implementações ● <element
que permitem uma chave column="hol_date"
duplicada, mas o hibernate type="date"/>
só suporta chaves únicas
● </map>
em um Map.
http://www.usiinformatica.com.br http://www.rsjug.org
Relacionamento Bi-Direcional
● Todas as coleções de objetos tem as opções de serem
salvas em uma tabela a parte, ou no caso de um
relacionamento one-to-many serem salvas como um
campo no objeto de destino, com a exceção de um
array, que só é salvo em uma tabela separada.
● Este tipo de relacionamento é útil principalmente
quando o objeto de destino tem a necessidade de
acessar o seu Dono, como por exemplo as contas
de uma agencia bancaria.
http://www.usiinformatica.com.br http://www.rsjug.org
HQL – Hibernate Query Language
● Para poder recuperar os dados utilizando o Hibernate, temos
disponível a HQL.
● Esta linguagem sendo um subset da OQL padronizada pela
ODMG, misturada com recursos úteis do SQL, misturando o
melhor dos dois mundos.
● Na última versão do hibernate, é possível executar uma consulta
SQL diretamente.
● O Hibernate também trás uma interface para consultar orientada
a objetos, chamada de Criteria API, esta mesmo sendo um
casamento com o Hibernate, trás diversas vantagens e
facilidades para o desenvolvimento.
http://www.usiinformatica.com.br http://www.rsjug.org
Abstraindo sua camada de
persistência
● Contrariando as regras da orientação a objetos, mas seguindo as boas
práticas de desenvolvimento, mesmo utilizando o Hibernate como
solução de mapeamento O/R, é recomendável a criação de um Layer
de persistência em sua aplicação.
● Esta camada também conhecida como Objetos de Acesso a Dados, ou
DAOs, além de encapsular a utilização do Hibernate, permite também, a
utilização mesclada do hibernate com JDBC puro, ou então, facilita a
troca da solução de persistência, quando esta for necessária, como por
exemplo, do Hibernate para o Prevayler ou para Entity Beans, ou até
mesmo para apenas JDBC.
● Estes objetos normalmente implementam as operações conhecidas
como CRUD (Create, Retrieve, Update and Delete) normalmente
oferecendo mais de um método de retrieve, ou consultas por exemplo
(QBE), isto é, a passagem de um ou dois objetos do tipo a ser
consultado, com as propriedades a serem utilizadas na consulta já
http://www.usiinformatica.com.br
preenchidas. http://www.rsjug.org
http://www.usiinformatica.com.br http://www.rsjug.org
Site do Hibernate: http://www.hibernate.org
http://www.usiinformatica.com.br http://www.rsjug.org
Rodrigo Urubatan Ferreira Jardim
Consultor/Desenvolvedor J2EE
rodrigo@usiinformatica.com.br
http://www.usiinformatica.com.br
http://www.usiinformatica.com.br http://www.rsjug.org