Mapeamento Objeto-Relacional Mapeamento objeto

Transcrição

Mapeamento Objeto-Relacional Mapeamento objeto
Mapeamento Objeto-Relacional
Persistência de dados com Java
Persistence API - Hibernate
Jefferson S Silva
Mapeamento objeto-relacional
• Mas como?
– SQL + JDBC !?
1
Para quê serve MOR?
• O uso de uma solução de mapeamento objetorelacional pode solucionar problemas do tipo:
– Como devem ser as classes persistentes?
– Como mapear hierarquias e relações?
– Como recuperar os dados de associações de forma
eficiente ?
– Como gerenciar os recursos necessários: transações,
cache, concorrência ?
Porquê usar MOR?
• Além da padronização da persistência.....!?
• Produtividade
– Elimina “90%” do código SQL da aplicação
– Reduz o custo de tratamento de transações, erros, entre outros.
• Manutenibilidade
– Menos linhas de código == melhor manutenção
– Redução drástica do impacto de mudanças na base de dados
• Desempenho
– Os recursos da solução de MOR (cache, lazy) podem melhorar
o desempenho das buscas
– Sobra tempo para a equipe trabalhar em otimizações do sistema
2
Mapeamento objeto-relacional
com Java Persistente API - JPA
O que é JPA
• A JPA é uma especificações da linguagem
Java para a persistência de dados.
• Atua na camada de persistência de dados.
• Define o mapeamento objeto-relacional
com base em anotações
3
Visão geral
• Existem algumas implementações
– Toplink
– Hibernate
– GlassFish
• Todos implementam a solução ORM de
acordo com a especificação JPA
• Têm o formato de arquivos *.jar que
adicionados ao classPath da aplicação
tornam-se disponíveis
A implementação Hibernate
• Mais conhecida, mais tradicional.
• Endereço para Download.
– http://www.hibernate.org
• Os arquivos necessários.
– Na pagina de downloads
4
Utilizando a JPA
• Passos para a utilização
– Download e instalação;
– Criação das classes persistentes;
– Definição do MOR;
– Configuração da JPA;
– Criação das tabelas no SGBD;
– Usar a API de manipulação dos dados.
Utilizando a JPA
• Os arquivos *.jar devem ser referenciados
no Build Path da aplicação
• Com a IDE eclipse fica fácil.
– Projeto > Propriedades > Java Build Path >
Libraries > add JARs...
5
Bibliotecas necessárias
•
•
•
•
•
•
•
•
•
•
•
•
•
antLr
asm
asm-attrs
c3p0
cglib
commons-collection
commons-logging
dom4j
ehcache
jaxem
jdbc2_0-stdext
jta
log4j
Bibliotecas necessárias
As mais importantes
• hibernate3
• ejb3-persistence
• hibernate-annotations
• Hibernate-entitymanager
6
Agora deixando de
conversa !!!!
JPA Annotations – Propriedades
7
JPA Annotations – Propriedades
• Quer que uma entidade seja persistente?
– Anote a classe (POJO) com @Entity
JPA Annotations – Propriedades
• Quer que uma propriedade seja
persistida?
– O nome da propriedade corresponde ao nome de
campo que a representa na tabela? Então não anote,
ela será persistida automaticamente.
8
JPA Annotations – Propriedades
• Não quer que uma propriedade seja
persistida?
– Anote a propriedade com @transient
JPA Annotations – Propriedades
• A propriedade não tem o mesmo nome da
coluna no banco?
– Anote a propriedade com @Column
9
JPA Annotations – Propriedades
• Quer que a propriedade seja o
identificador do objeto?
– Anote a propriedade com @Id
JPA Annotations – Propriedades
• Quer definir a estratégia de geração de
Ids?
– basta utilizar a anotação @GeneratedValue e definir
a estratégia.
10
JPA Annotations – Propriedades
• E a entidade? Tem o mesmo nome da tabela
em que será armazenada?
– Se não, defina a tabela com a anotação @Table
JPA Annotations – Propriedades
• Anotações para propriedades do tipo de
dados simples
– @Transciente: Não será persistida no banco
– @Basic: define tipo numéricos, booleanos,
Strings, etc.
– @Temporal: define datas e horas
– @Lob: define textos ou binários grandes
• Default : @Basic
11
JPA Annotations – Relacionamentos
JPA Annotations – Relacionamentos
• A entidade possui uma propriedade composta
cujo tipo é uma outra entidade?
– Use a anotação @OneToOne em uma propriedade
do tipo correspondente.
12
JPA Annotations – Relacionamentos
• Entendendo o OneToOne
Pessoa
Ramal
JPA Annotations – Relacionamentos
• A entidade faz parte de uma coleção de
entidades de outras entidade?
– Use a anotação @ManyToOne para uma
propriedade que representará a entidade
dona da coleção.
Ramal
13
JPA Annotations – Relacionamentos
• A entidade possui uma coleção de outras
entidades?
– Use a anotação @OneToMany para uma propriedade
que representará a coleção
Pessoa
JPA Annotations – Relacionamentos
• Relacionamento bidirecional Um-para-muitos
14
JPA Annotations – Relacionamentos
• Duas entidades possuem coleções umas das
outras?
– Então ambas entidades terão propriedades de
coleção com a anotação @ManyToMany
JPA Annotations – Relacionamentos
• Entendendo o ManyToMany
15
CascadeType.PERSIST
• Em uma operação de persistência, a entidade
possuidora é persistida em conjunto com a
entidade que a completa, não sendo necessária
a operação de persistência manual da outra
entidade!
CascadeType.MERGE
• A sincronização no banco de dados é realizada
automaticamente para as entidades que
completam uma entidade principal.
16
CascadeType.REMOVE
• Remoção em cascata
• A entidade E2 associada a entidade E1, também
será removida!
CascadeType.REFRESH
• Parecido com MERGE
• Atualiza a instância do objeto a partir do Banco
de Dados
• As entidades relacionadas também serão
atualizadas
17
JPA Annotations – Configurações
JPA Annotations – Configurações
• Algumas possibilidades diferentes
– Hibernate.cfg.xml
– Persistence.xml
– Hibernate.properties
18
JPA Annotations – Configurações
• Descrição das unidades de persistência.
–
–
–
–
–
–
–
–
Provedor de persistência
Dialeto usado para manipulação
Driver usado para acessar o banco de dados
Usuário do banco de dados
Senha do banco de dados
Url do banco de dados
As entidades que farão parte do contexto.
Varias outras configuração como:
• Configuração do pool de conexões
• Controle sobre as ações do hibernate sobre o banco
• Etc......
JPA Annotations – Configurações
• O mais interessante!
– Definir vários contextos diferentes de acordo
com as necessidades e identificá-los pelo
nome
19
JPA Annotations – Configurações
JPA Annotations – Configurações
•
Dialect: É uma classe que faz o cruzamento das funções do hibernate com
as funções do banco de dados. Por exemplo, no Hibernate não temos a
função Ltrim, mas utilizando o dialect para o Oracle este já estará
disponível para utilização. Possiveis valores:
•
•
•
•
•
•
•
•
•
•
DB2 - org.hibernate.dialect.DB2Dialect
HypersonicSQL - org.hibernate.dialect.HSQLDialect
Informix - org.hibernate.dialect.InformixDialect
Ingres - org.hibernate.dialect.IngresDialect
Interbase - org.hibernate.dialect.InterbaseDialect
Pointbase - org.hibernate.dialect.PointbaseDialect
PostgreSQL - org.hibernate.dialect.PostgreSQLDialect
Mckoi SQL - org.hibernate.dialect.MckoiDialect
Microsoft SQL Server - org.hibernate.dialect.SQLServerDialect
MySQL - org.hibernate.dialect.MySQLDialect
20
JPA Annotations – Configurações
• hbm2ddl.auto: Esta propriedade indica ao hibernate
que ele deverá atualizar o schema do banco de dados
ao inicializar a aplicação, ou seja, atualizar tabelas,
indices, entre outros com seus arquivos de
mapeamento. Por exemplo, se no arquivo de
mapeamento tiver um campo e no banco de dados não
tiver, ele fará um ALTER TABLE para adicionar este
campo. Os possiveis valores são:
create - apenas cria as tabelas e indices, se já tiverem sido
criados não faz nada
create-drop - apaga o schema e o recria.
update - faz sincronismo entre XML de mapeamento e banco de
dados.
• show_sql: Esta propriedade indica ao hibernate se
deverá ou não logar todos os comandos SQL. Os
possiveis valores são: true ou false.
Manuseando os objetos
21
Entendendo o ciclo de vida
dos objetos
Estados do ciclo de vida
• Objetos transiente
– Obtidos através da keyword “new”.
– Objetos simples do Java, ainda não passados
para o hibernate.
– Não podem ter associações com objetos
persistentes(persistência transitiva)
– Não possuem representação no banco.
– Não possuem identidade
22
Estados do ciclo de vida
• Objetos persistentes
– Possuem representação no banco de dados,
inclusive identidade.
– Objetos recuperados do banco pelo Hibernate
diretamente ou por transitividade;
– Estão sempre associados a um objeto
Session ou EntityManager.
Estados do ciclo de vida
• Objetos destacados (Detached)
– Objetos que foram persistentes ou transientes
mas que não estão mais associados a um
contexto persistente;
– Quando uma session fecha, os objetos ainda
“abertos” tornam-se destacados;
– Não há garantias de que esses objetos serão
sincronizados.
– Eles podem ser re-associados através do
metodo save(), update() ou save-update();
23
Estados do ciclo de vida
• Objetos persistentes = Objetos transacionais
– Um objeto associados a uma session participa de
uma transação e seu estado é atualizados ao final
desta(Ou em sincronizações).
– Se dynamic-update = true o Hibernate atualiza
somente as propriedades alteradas, se false, atualiza
todo objeto, mas somente os que foram alterados;
– Os objetos são gerenciados dinamicamente pelo
proxy do Hibernate. Isso quer dizer, que objetos
persistentes são espelhos do banco de dados
mantidos em cache pelo Hibernate. E não uma
ligação direta com ele.
O gerenciador de objetos
EntityManager
• O que ele provê:
– Operações CRUD básicas;
– Execução de consultas;
– Controle de transações;
– Gerencia de cache;
24
JPA – estratégias de recuperação
de objetos
• Recuperação preguiçosa ( Lazy): Sob
demanda;
• Recuperação adiantada (eager): uso de
outer joins;
Mãos a obra
25
Estrutura
• Estrutura do projeto
Adicionando os arquivos *.jar
da implementação Hibernate
26
Adicionando os jars
• A fonte
–
–
–
–
Fazer o donwload ( http://www.hibernate.org/6.html )
Descompactar os arquivos
Copiar os arquivos *.jar para a aplicação
Adiciona ao Build Path
Adicionando os jars
• Para adicionar ao build path: projeto >
propriedades > libraries > add JARs...
27
Mapeando as propriedades
Mapeando os objetos - Ramal
• Mapeando a Entidade Ramal
28
Mapeando os objetos - Ramal
• Mapeando o identificador da entidade
Mapeando os objetos - Ramal
• Mapeando a propriedade da entidade
Ou
29
Mapeando os objetos - Pessoa
Mapeando os objetos - Usuario
30
Mapeando os objetos herança Pessoa-Usuario
• Entidade Pessoa
• Entidade Usuario
Mapeando os relacionamentos
31
Mapeando as coleções:
uma pessoa para muitos ramais
• Entidade Pessoa
• Entidade Ramal
Mapeando as coleções:
uma pessoa para muitos ramais
• Lembrando do banco.
32
Mapeando as coleções:
Muitas pessoa para muitos ramais
• Entidade Pessoa
• Entidade Ramal
Mapeando as coleções:
Muitas pessoa para muitos ramais
• Lembrando do banco
33
Mapeando as coleções:
Muitas pessoa para muitos ramais
• Identificar posição das chaves
Entidade que se está
mapeando
34

Documentos relacionados

Mapeamento Lógico/Relacional com JPA

Mapeamento Lógico/Relacional com JPA !   Integração com diversos frameworks (não pode ser usado isoladamente)

Leia mais

Artigo EspWeb 2013 - Aurélio Junior

Artigo EspWeb 2013 - Aurélio Junior projeto e por se tratar de um projeto “pessoal”, King utilizava seu tempo livre para que pudesse resolver problemas identificados pelos usuários do Hibernate. Com um escopo muito vasto, o projeto t...

Leia mais

mapeamento objeto relacional com hibernate em

mapeamento objeto relacional com hibernate em em relação ao mapeamento das tabelas no banco de dados, o qual facilita grandemente o trabalho do desenvolvedor. Com a grande competitividade no mercado de software atual, o desenvolvimento de apli...

Leia mais