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 do projeto Estrutura 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