Você está na página 1de 34

Mapeamento Objeto-Relacional

Persistência de dados com Java Persistence API - Hibernate

Jefferson S Silva

Mapeamento objeto-relacional

Mapeamento objeto-relacional • Mas como? – SQL + JDBC !?

• Mas como?

– SQL + JDBC !?

Para quê serve MOR?

• O uso de uma solução de mapeamento objeto- relacional 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

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

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

A implementação Hibernate • Mais conhecida, mais tradicional. • Endereço para Download. – http://www.hibernate.org • Os

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

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

Agora deixando de conversa !!!!

JPA Annotations – Propriedades

JPA Annotations – Propriedades

• Quer que uma entidade seja persistente?

– Anote a classe (POJO) com @Entity

JPA Annotations – Propriedades • Quer que uma entidade seja persistente? – Anote a classe (POJO)

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.

JPA Annotations – Propriedades • Quer que uma propriedade seja persistida? – O nome da propriedade

JPA Annotations – Propriedades

• Não quer que uma propriedade seja persistida?

– Anote a propriedade com @transient

JPA Annotations – Propriedades • Não quer que uma propriedade seja persistida? – Anote a propriedade

JPA Annotations – Propriedades

• A propriedade não tem o mesmo nome da coluna no banco?

– Anote a propriedade com @Column

JPA Annotations – Propriedades • A propriedade não tem o mesmo nome da coluna no banco?

JPA Annotations – Propriedades

• Quer que a propriedade seja o identificador do objeto?

– Anote a propriedade com @Id

JPA Annotations – Propriedades • Quer que a propriedade seja o identificador do objeto? – Anote

JPA Annotations – Propriedades

• Quer definir a estratégia de geração de Ids?

– basta utilizar a anotação @GeneratedValue e definir a estratégia.

JPA Annotations – Propriedades • Quer definir a estratégia de geração de Ids? – basta utilizar

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 • E a entidade? Tem o mesmo nome da tabela em que

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

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.

JPA Annotations – Relacionamentos • A entidade possui uma propriedade composta cujo tipo é uma outra
JPA Annotations – Relacionamentos • A entidade possui uma propriedade composta cujo tipo é uma outra

JPA Annotations – Relacionamentos

• Entendendo o OneToOne

Pessoa Ramal
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

JPA Annotations – Relacionamentos • A entidade faz parte de uma coleção de entidades de outras

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 • A entidade possui uma coleção de outras entidades? – Use a

JPA Annotations – Relacionamentos

• Relacionamento bidirecional Um-para-muitos

JPA Annotations – Relacionamentos • Relacionamento bidirecional Um-para-muitos
JPA Annotations – Relacionamentos • Relacionamento bidirecional Um-para-muitos

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 • Duas entidades possuem coleções umas das outras? – Então ambas entidades
JPA Annotations – Relacionamentos • Duas entidades possuem coleções umas das outras? – Então ambas entidades

JPA Annotations – Relacionamentos

• Entendendo o ManyToMany

JPA Annotations – Relacionamentos • Entendendo o ManyToMany
JPA Annotations – Relacionamentos • Entendendo o ManyToMany
JPA Annotations – Relacionamentos • Entendendo o ManyToMany

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.

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

JPA Annotations – Configurações

JPA Annotations – Configurações

• Algumas possibilidades diferentes

– Hibernate.cfg.xml – Persistence.xml – Hibernate.properties

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

JPA Annotations – Configurações

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

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

Entendendo o ciclo de vida dos objetos

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

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();

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;

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

Estrutura

• Estrutura do projeto

Estrutura • Estrutura do projeto

Adicionando os arquivos *.jar da implementação Hibernate

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 • A fonte – Fazer o donwload ( http://www.hibernate.org/6.html ) – Descompactar os

Adicionando os jars

• Para adicionar ao build path: projeto > propriedades > libraries > add JARs ...

Adicionando os jars • Para adicionar ao build path: projeto > propriedades > libraries > add

Mapeando as propriedades

Mapeando os objetos - Ramal

• Mapeando a Entidade Ramal

Mapeando os objetos - Ramal • Mapeando a Entidade Ramal

Mapeando os objetos - Ramal

• Mapeando o identificador da entidade

Mapeando os objetos - Ramal • Mapeando o identificador da entidade

Mapeando os objetos - Ramal

• Mapeando a propriedade da entidade

Mapeando os objetos - Ramal • Mapeando a propriedade da entidade Ou

Ou

Mapeando os objetos - Ramal • Mapeando a propriedade da entidade Ou

Mapeando os objetos - Pessoa

Mapeando os objetos - Pessoa

Mapeando os objetos - Usuario

Mapeando os objetos - Usuario

Mapeando os objetos - herança Pessoa-Usuario

• Entidade Pessoa

Mapeando os objetos - herança Pessoa-Usuario • Entidade Pessoa • Entidade Usuario

• Entidade Usuario

Mapeando os objetos - herança Pessoa-Usuario • Entidade Pessoa • Entidade Usuario

Mapeando os relacionamentos

Mapeando as coleções:

uma pessoa para muitos ramais

• Entidade Pessoa

Mapeando as coleções: uma pessoa para muitos ramais • Entidade Pessoa • Entidade Ramal

• Entidade Ramal

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.

Mapeando as coleções: uma pessoa para muitos ramais • Lembrando do banco.
Mapeando as coleções: uma pessoa para muitos ramais • Lembrando do banco.

Mapeando as coleções:

Muitas pessoa para muitos ramais

• Entidade Pessoa

Mapeando as coleções: Muitas pessoa para muitos ramais • Entidade Pessoa • Entidade Ramal

• Entidade Ramal

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

Mapeando as coleções: Muitas pessoa para muitos ramais • Lembrando do banco

Mapeando as coleções:

Muitas pessoa para muitos ramais

• Identificar posição das chaves

Entidade que se está mapeando
Entidade que se está
mapeando