Você está na página 1de 23

Persistência fácil de objetos com

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

● Projetando a hierarquia de objetos e esquecendo o banco de dados

● Persistindo seus objetos de dados

– Persistindo objetos simples


– Persistindo coleções
● Boas práticas

– Abstraindo a sua camada de persistência de dados


● Consulta a dados

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">

mapeamento para o modelo <generator class="assigned"/>


relacional. </id>

● Todas as classes do pacote <property name="descricao" type="text"/>


java.lang são equivalentes <property name="valor"/>
aos tipos de dados primitivos
</class>
do banco de dados.
● Todo objeto persistido pelo
hibernate, precisa de uma
propriedade de identificação,
como a chave primaria do
http://www.usiinformatica.com.br
banco de dados. http://www.rsjug.org
Um ID para um Objeto?
● um ID ou chave primaria, não ● Tipos de
tem relação nenhuma com a
Orientação a objetos, mas é Identificação:
uma imposição do modelo – assigned/fornecida
relacional, onde os dados
serão armazenados. – Gerada
● native –- dependente do
● por este motivo, todo o tipo de banco de dados
dados persistido como uma ● increment
entidade Objeto/Relacional,
● sequence
precisa prover esta
identificação para possibilitar ● hilo
o mapeamento para o banco ● seqhilo
de dados ● uuid.hex
● uuid.string
http://www.usiinformatica.com.br http://www.rsjug.org
foreign ●
Tipos de dados padrão
● O Hibernate implementa ● Todas as classes
mapeamento padrão para configuradas como
todos os tipos de dados persistentes também podem
primitivos do java, todas as ser utilizadas como um tipo
de dados, em qualquer
classes Wraper e as
propriedade, isto se torna o
classes:
equivalente a uma chave
– java.sql.Date estrangeira em um banco de
dados.
– java.sql.Time
● os Tipos Collection também
– java.sql.Timestamp são funcionais de fabrica,
– java.util.Date mas discutiremos isto depois.
– java.util.Calendar e qualquer tipo serializável

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:

– Component - é um objeto relacionado que é salvo na mesma tabela,


transferindo para o banco de dados o conceito de composição.
– Enumeração - pode ser definido um tipo de dados que aceita apenas uma
pequena quantidade de inteiros como valor, e os mapeia para um nome,
para isto basta definir uma classe que extende
net.sf.hibernate.PersistentEnum como tipo do campo.
– Tipo costumizado – podem ser definidos ou redefinidos quaisquer tipo de
mapeamento de tipos de dados, para isto, basta sobre escrever as classes:
● net.sf.hibernate.UserType
● ou net.sf.hibernate.CompositeUserType
– Any Type – é uma propriedade equivalente a Object, que aceita qualquer
entidade como valor.

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">

● Como no java, arrays são <key column="BAR_ID"/>


ótimos para armazenar <index column="I"/>
quantidades não muito
<many-to-many
grandes de dados, com column="FOO_ID"
tamanho mais ou menos class="org.hibernate.Foo"/>
fixo e de uma maneira
posicional. </array>

http://www.usiinformatica.com.br http://www.rsjug.org
Persistindo um List
<list name="carComponents"
● O contrato da table="car_components">

interface <key column="car_id"/>

java.util.List, diz que <index column="posn"/>

<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"/>

itens repetidos, isto ● </set>

é 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

Artigo sobre Persistência de objetos:


http://www.research.ibm.com/journal/sj/361/srinivasan.html

Boas práticas no mapeamento Objeto Relacional:


http://www.agiledata.org/essays/mappingObjects.html

Tutorial sobre a utilização do Spring com Hibernate, Xdoclet


e Middlegen: http://www.warfrog.com/hibernatetutorial/

http://www.usiinformatica.com.br http://www.rsjug.org
Rodrigo Urubatan Ferreira Jardim
Consultor/Desenvolvedor J2EE

Sun Certified Web Component Developer for J2EE 1.4


Sun Certified Programmer for the Java 2 Platform 1.4

rodrigo@usiinformatica.com.br
http://www.usiinformatica.com.br

http://www.usiinformatica.com.br http://www.rsjug.org

Você também pode gostar