Baixe o app para aproveitar ainda mais
Prévia do material em texto
PERSISTENCIA COM JAVA Introdução a persistência com mapeamento OR JPA e Hibernate Prof. Jaqson Dalbosco jaqson@upf.br PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Persistência • Persistência significa continuar a existir, preservar, durar longo tempo ou permanecer. No contexto de programação orientada a objetos, a persistência significa a possibilidade desses objetos serem armazenados em meio externo à aplicação, portanto, deverá permitir que esses objetos não sejam voláteis. • Atualmente, os bancos de dados relacionais são o meio mais utilizados para persistência de objetos em Java. • Necessidade de mapeamento objeto-relacional. 2 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Mapeamento Objeto-Relacional •Mapeamento objeto-relacional (ORM) é a técnica de mapear dados de objetos para um BD relacional. •Linguagens de Programação orientadas a objetos e SGBDs relacionais = complexidade de implementação 3 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Requisitos Para trabalhar persistência de objetos em SGBDs relacionais com Java, é preciso: a) implementar as classes de objetos de negócio (persistentes) seguindo um Design Pattern (padrão de projeto) adotado pelos frameworks de persistência; d) implementar o mapeamento O-R definindo como os objetos serão armazenados e recuperados de registros em tabelas do banco de dados; b) dispor de framework de persistêcnia que realize todo o trabalho “pesado” da conversão O-R e persistência; c) implementar a conexão com o BD (JDBC, unidade de persistência) d) ao implementar os códigos da aplicação, utilizar classes do framework que permitem manipular os objetos no contexto persistente. 4 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Classes de Objetos de Negócio Persistentes – JavaBeans public class Ator implements java.io.Serializable { private Integer id; private String nome; public Ator(){ } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } } 5 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Classes dos objetos de negócio (persistentes) Implementadas a partir do diagrama de classes de domínio do negócio 6 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Framework Hibernate O Hibernate é um framework para o Mapeamento Objeto- Relacional (ORM) escrito na linguagem Java, mas também é disponível em .Net como o nome NHibernate. O termo mapeamento objeto-relacional (ORM) é a técnica de mapear dados originalmente armazenados de forma relacional em um modelo de objetos. O principal objetivo do Hibernate é diminuir a complexidade entre os programas Java, baseado no modelo orientado a objeto, que precisam trabalhar com um banco de dados do modelo relacional (presente na maioria dos SGDBs). Sua principal característica é a transformação das classes em Java para tabelas de dados e dos tipos de dados Java para os da linguagem SQL. 7 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Framework Hibernate ¨ Permite uma persistência transparente para o desenvolvimento das aplicações; ¨ facilita o mapeamento dos atributos entre uma base de dados relacionais e o modelo de objetos de uma aplicação; ¨ Usa arquivos XML ou Anotações na próprias classes para estabelecer esta relação. ¨ Está na terceira versão (maduro); ¨ É um software livre de código aberto distribuído com a licença LGPL. 8 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Framework Hibernate •Instalando o Hibernate Core Arquivos 9 antlr.jar cglib.jar asm.jar asm-attrs.jars commons-collections.jar commons-logging.jar hibernate3.jar javassist.jar jta.jar dom4j.jar log4j.jar hibernate-annotations.jar ejb3-persistence.jar hibernate-commons-annotations.jar hibernate-entitymanager.jar PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) JPA - Java Persistence API - Consiste de um conjunto de interfaces e anotações que visam padronizar o acesso aos frameworks de mapeamento O/R e se baseia nas melhores idéias de tecnologias de persistência como Hibernate, TopLink, e JDO. - Solução completa para mapeamento e persistência de objetos: modo declarativo de descrever mapeamento O/R, linguagem de consulta, ferramentas para manipular entidades - A JPA foi introduzida com a plataforma Java EE 5. - Desenvolvida como parte da JSR-220 - Tecnologia EJB 3.0, a JPA se integra homogênea e consistentemente com o resto das simplificações nas APIs EJB 3.0 - Provê à comunidade Java uma única API padrão de persistência, com a liberdade de escolha do provedor (implementação) - Rapidamente os frameworks se adaptaram para funcionar como provedores JPA, incluindo recursos que permitam utilizar o padrão JPA para a construção de camadas de persistência 10 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Java Persistence API 11 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) JPA - Anotações • A JPA define um meio de mapeamento Objeto-Relacional para objetos Java simples e comuns (POJOS), por meio de anotações incluídas nas classes. “Basicamente, uma anotação é uma maneira de acrescentar informações sobre uma parte do código (no mundo Java, geralmente uma classe, um campo ou método) para ajudar as ferramentas entenderem como o código está sendo utilizado ou para permitir a automatização, poupando trabalho”. (Elliott, 2009) 12 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) JPA - Anotações • Anotações com JPA 13 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) JPA - Anotações • Anotações com JPA (continuação) 14 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) @Entity - Exemplo Anotação associada a classes Java. Determina que a classe é persistente. 15 Obrigatório Obrigatório PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) @Id – Exemplo Toda classe precisa ter um identificador, que será associado a chave primária da tabela no banco de dados. O atributo anotado com @Id será o identificador, tanto para as instâncias de objetos da classe que está sendo mapeada como para os registros da respectiva tabela no banco de dados. 16 Opcional PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Passos para criar uma aplicação Java com BD •Criar um Banco de Dados para o projeto(PostgreSQL, MySQL, ...); •Criar um novo projeto Java (Aplicativo Java); •Adicionar Biblioteca “Hibernate-JPA” no projeto; •Adicionar driver JDBC no projeto; •Criar uma Unidade de Persistência (criar conexão com o BD); – Se usar o FirebirdSQL, adicionar no XML: <property name="hibernate.dialect" value="org.hibernate.dialect.FirebirdDialect"/> •Criar as classes de entidade – JavaBeans (do diagrama); – Adicionar mapeamentos de persistência nas classes (@Entity, @Id, @Column, @OneToMany, ...); •Adicionar classes mapeadas na unidade de persistência; •Para usar a Persistência (criar programa): – Usar Persistence.EntityManagerFactory para criar uma instância de EntityManager usando a Unidade de Persistência; – Usar métodos de persistência da EntityManager (persist, merge, remove, createQuery, ...). 17 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Arquivo de Configuração – Unidade de Persistência - Visual 18 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Quando usar Firebird, adicionar manualmente a linha para o dialeto. Arquivo de Configuração – Unidade de Persistência - XML 19 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Ciclo de vida das entidades 20 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Estados do ciclode vida das entidades Estado Transient (Transitório) Quando damos um new em uma entidade anotada com @Entity (objeto-entidade), ela ainda não é reconhecida pelo JPA porque ela nunca passou pelo gerenciador de persistência EntityManager. A entidade também não possui um ID e, provavelmente, não existe no banco de dados. Neste caso, não há garantia alguma de que os dados existentes no objeto-entidade serão persistidos no banco quando o processamento do sistema terminar. Este estado é conhecido como Transient. Estado Managed (Gerenciado) O estado Managed é o estado onde o JPA reconhece a existência de um objeto- entidade e, consequentemente, o JPA garante que esse objeto terá representação idêntica no banco de dados. Isso significa que qualquer alteração que você fizer nesse objeto será automaticamente persistido no banco. Um detalhe importante: o fluxo de sincronização parte sempre do objeto para o banco de dados, nunca ao contrário. Isso significa que o JPA não detecta alterações realizadas diretamente no banco de dados. 21 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Estados do ciclo de vida das entidades Estado Detached (Destacado) A característica desse estado é que os objetos possuem um ID, provavelmente possui a informação no banco, mas não está sendo gerenciado pelo EntityManager. Se você também dar um new em um objeto-entidade e atribuir manualmente um ID a ele, ele também torna-se um objeto destacado. Um objeto managed, recuperado do banco e que foi destacado, pode sofrer alterações em memór ia sem afetar os dados no banco de dados. Estado Removed (Removido) Removed é quando queremos excluir um objeto-entidade do banco. A característica de um objeto removido é que ele possui um ID, não está mais gerenciado pelo EntityManager e não está mais no banco de dados. Um objeto-entidade só pode ser removido se estiver, primeiro, em um estado gerenciado. 22 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Criando uma EntityManager Para criar uma fábrica de EntityManager: EntityManagerFactory emf = Persistence.createEntityManagerFactory( "NomeUnidadePersistencia“); Onde “NomeUnidadePersistencia” é o nome dado quando a unidade de persistência é criada. Para criar uma EntityManager: EntityManager em = emf.createEntityManager(); Com o objeto em criado, pode-se então chamar os métodos de persistência de objetos, conforme exemplos a seguir. Uma boa prática é criar uma classe Singleton para obter uma factory! 23 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Usando EntityManager para persistir um objeto //Um objeto na memória: Ator a = new Ator(1, "Julia Roberts"); // Armazenando o objeto no BD em.getTransaction().begin(); em.persist(a); em.getTransaction().commit(); ATENÇÃO: modificações no BD só ocorrem se uma transação foi iniciada (em.getTransaction().begin();) antes de chamar o método de persistência (em.persist(a);) e no final for executado commit na transação (em.getTransaction().commit();). A transação é necessária para uso com qualquer método de persistência que for modificar os dados do objeto no BD. 24 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Usando EntityManager para carregar um objeto // Carregar do BD um objeto pelo seu id Ator a = em.find(Ator.class, 2); // acessando os dados do objeto carregado System.out.println( "Código: "+a.getId()+ " Nome: "+a.getNome()); 25 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Usando EntityManager para alterar um objeto em.getTransaction().begin(); // carregar um objeto do BD Ator a = em.find(Ator.class, 2); // modificar o objeto a.setNome("Ator Modificado"); em.getTransaction().commit(); •OBS: após o commit os dados do objeto são atualizados no BD! 26 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Usando EntityManager para remover um objeto em.getTransaction().begin(); // carregar um objeto do BD Ator a = em.find(Ator.class, 2); // remover o objeto do BD em.remove(a); em.getTransaction().commit(); •OBS: após o commit, o objeto é removido do BD 27 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Usando EntityManager para listar objetos // Recupera todos os objetos Ator do BD Collection<Ator> lista = em.createQuery("from Ator”).getResultList(); // percorre a lista de atores e lista seus dados for(Ator at: lista) System.out.println( " Código: "+at.getId()+ " Nome: "+at.getNome()); 28 PERSISTÊNCIA COM JAVA Mapeamento Objeto-Relacional (ORM) Referências • ELLIOTT J.; O’BRIEN T.M.; FOWLER R. Dominando Hibernate. Tradução do original: Harnessing Hibernate. Rio de Janeiro: AltaBooks, p.125, 2009. • Mapeamento Objeto-Relacional com Hibernate. Profs. Benefrancis do Nascimento e Jaime K. Ossada. • JPA – Java Persistence API. Prof. Gilberto Irajá Muller 29
Compartilhar