Persistência Com JPA & Hibernate Rui Rossi dos Santos ruirossi@ruirossi.pro.br Mediador: Rui Rossi dos Santos Slide 1
Mapeamento Objeto-Relacional Contexto: Linguagem de programação orientada a objetos SGBD relacionais Programa Java Banco de Dados Objeto Objeto Objeto Mapeamento O-R Framework de Persistência Tabela Tabela Tabela Mediador: Rui Rossi dos Santos Slide 2
Hibernate Framework para mapeamento objeto-relacional (ORM) Objetivo: reduzir a complexidade de aplicações Java. Caracterização: É um software livre (licença LGPL). É um framework maduro (terceira versão). Usa arquivos XML ou anotações nas próprias classes. Mediador: Rui Rossi dos Santos Slide 3
Bibliotecas: Hibernate antlr-2.7.6.jar asm.jar asm-attrs.jar cglib-2.1.3.jar commons-collections-2.1.1.jar commons-logging-1.1.jar dom4j-1.6.1.jar ehcache-1.2.3.jar hibernate3.jar hibernate-annotations.jar hibernate-commons-annotations.jar hibernate-entitymanager.jar hibernate-tools.jar javassist.jar jdbc2_0-stdext.jar jta.jar Mediador: Rui Rossi dos Santos Slide 4
Primeiro Exemplo Ferramentas Banco de dados: MySQL Server 5 MySQL Query Browser MySQL Administrator IDE: NetBeans 6.8 Mediador: Rui Rossi dos Santos Slide 5
Primeiro Exemplo Passo 1: criação do banco de dados Nome do banco: introhibernate Tabela categoria: id: integer PK auto_increment descricao: varchar(50) ID DESCRICAO CATEGORIA int(10) varchar(50) <pk> Mediador: Rui Rossi dos Santos Slide 6
Primeiro Exemplo Passo 2: criação de uma conexão no NetBeans URL: jdbc:mysql://localhost:3306/introhibernate Driver: MySQL Connector Host: localhost Porta: 3306 Banco: introhibernate Usuário: root Nome: IntroHibernate Mediador: Rui Rossi dos Santos Slide 7
Primeiro Exemplo Passo 3: criação de um projeto no NetBeans Escolha do projeto: Categoria: Java Web Projeto: Aplicação Web Nome e local: Nome: IntroHibernate1 Servidor e configurações: Servidor: Tomcat 6.0.20 Versão do Java: Java EE 5 Contexto: /IntroHibernate1 Frameworks: nenhum Mediador: Rui Rossi dos Santos Slide 8
Primeiro Exemplo Passo 4: configuração do projeto Modificar a codificação de caracteres para ISO-8859-1. Adicionar bibliotecas: Hibernate Hibernate JPA MySQL JDBC Driver Mediador: Rui Rossi dos Santos Slide 9
Primeiro Exemplo Passo 5: criação de arquivo (Categoria.java) Tipo do arquivo: Categoria: Persistence Tipo: Classe de entidade do banco de dados Tabela do banco de dados: Conexão: IntroHibernate Tabelas selecionadas: categoria Incluir tabelas relacionadas: NÃO Classes de entidade: Tabela/Classe: categoria/categoria Pacote: br.pro.ruirossi Gerar anotações de consulta nomeada para campos persistentes Opções do mapeamento: Obter associações: padrão Tipo de coleção: java.util.collection Mediador: Rui Rossi dos Santos Slide 10
Primeiro Exemplo Passo 6: criação de um servlet (Controlador.java) Tipo do arquivo: Categoria: Web Tipo: Servlet Nome e local: Nome da classe: Controlador Pacote: br.pro.ruirossi Configurações: Nome do servlet: Controlador URL: /controlador Mediador: Rui Rossi dos Santos Slide 11
Primeiro Exemplo Passo 6: criação de um servlet (Controlador.java) Preparar o servlet para realizar duas operações: Inserir novas categorias Consultar todas as categorias registradas Inserção: método categoriainsert( ) Consulta: método categoriafindall( ) Método adicional: gethibernatesession() Ilustra como criar uma sessão no Hibernate Mediador: Rui Rossi dos Santos Slide 12
Primeiro Exemplo Passo 7: camada de apresentação index.jsp: menu inicial. categoria_incluir.jsp: formulário de cadastro de categoria. categoria_consultar.jsp: relatório de categorias cadastradas. sucesso.jsp: confirmação da gravação de um registro. erro_tratado.jsp: informações sobre erro ocorrido. Mediador: Rui Rossi dos Santos Slide 13
Passo 8: execução e testes Primeiro Exemplo Mediador: Rui Rossi dos Santos Slide 14
Exercício 1 Crie uma cópia do projeto IntroHibernate1 e chame-o de IntroHibernate2. Acrescente uma funcionalidade ao projeto IntroHibernate2 que permita alterar a descrição de uma categoria previamente cadastrada. Crie um arquivo chamado categoria_alterar.jsp para captar os dados da categoria a ser alterada. Crie um método no servlet e utilize o método update( ) da classe org.hibernate.session para realizar essa operação. Mediador: Rui Rossi dos Santos Slide 15
Exercício 2 Acrescente uma funcionalidade ao projeto IntroHibernate2 que permita excluir uma categoria previamente cadastrada. Crie um arquivo chamado categoria_excluir.jsp para captar a identificação da categoria a ser excluída. Crie um método no servlet e utilize o método delete( ) da classe org.hibernate.session para realizar essa operação. Mediador: Rui Rossi dos Santos Slide 16
Exercício 3 Acrescente uma funcionalidade ao projeto IntroHibernate2 que permita consultar uma categoria previamente cadastrada. Crie um arquivo chamado categoria_consultar.jsp que capte a identificação de uma categoria e exiba sua descrição. Crie um método no servlet e utilize o método get( ) da classe org.hibernate.session para realizar essa operação. Mediador: Rui Rossi dos Santos Slide 17
JPA Java Persistence API Caracterização: Conjunto de interfaces e anotações. Padronizam o acesso a frameworks O-R. Baseia-se nas melhores idéias dos frameworks de persistência. Introduzida com a plataforma JEE 5. Parte da tecnologia EJB 3.0. Unifica a API de persistência. Oferece liberdade para escolha de provedor. Hibernate TopLink JDO Mediador: Rui Rossi dos Santos Slide 18
JPA & Hibernate Mediador: Rui Rossi dos Santos Slide 19
Bibliotecas: JPA & Hibernate antlr-2.7.6.jar asm.jar asm-attrs.jar cglib-2.1.3.jar commons-collections-2.1.1.jar commons-logging-1.1.jar dom4j-1.6.1.jar ehcache-1.2.3.jar ejb3-persistence.jar (JPA) hibernate3.jar hibernate-annotations.jar hibernate-commons-annotations.jar hibernate-entitymanager.jar hibernate-tools.jar javassist.jar jdbc2_0-stdext.jar jta.jar Mediador: Rui Rossi dos Santos Slide 20
Conceitos importantes: JPA & Hibernate Unidade de Persistência: conjunto de configurações necessárias para a aplicação Java acessar o BD e reconhecer as classes que representam entidades do BD. Provedor de Persistência: implementa as interfaces definidas pela JPA (Ex.: TopLink, Hibernate, JDO). Gerenciador de Entidade (EntityManager): responsável por realizar as operações de persistência. Mediador: Rui Rossi dos Santos Slide 21
JPA & Hibernate Criação de um EntityManager: Criar uma fábrica de EntityManager EntityManagerFactory emf = Persistence.createEntityManagerFactory("HibernatePU"); Obs.: HibernatePU é o nome da unidade de persistência. Criar um EntityManager: EntityManager em = emf.createentitymanager(); Mediador: Rui Rossi dos Santos Slide 22
JPA & Hibernate Operações de persistência com um EntityManager: Gravar um objeto no banco de dados: Assunto assunto = new Assunto(1, Filosofia ); em.gettransaction().begin(); em.persist(assunto); em.gettransaction().commit(); Mediador: Rui Rossi dos Santos Slide 23
JPA & Hibernate Operações de persistência com um EntityManager: Recuperar um objeto do banco de dados: Assunto assunto = em.find(assunto.class, 1); Mediador: Rui Rossi dos Santos Slide 24
JPA & Hibernate Operações de persistência com um EntityManager: Remover um objeto do banco de dados: em.gettransaction().begin(); Assunto assunto = em.find(assunto.class, 1); em.remove(assunto); em.gettransaction().commit(); Mediador: Rui Rossi dos Santos Slide 25
JPA & Hibernate Operações de persistência com um EntityManager: Alterar um objeto no banco de dados: primeira forma em.gettransaction().begin(); Assunto assunto = em.find(assunto.class, 1); assunto.setdescricao( Programação ); em.gettransaction().commit(); Alterar um objeto no banco de dados: segunda forma em.gettransaction().begin(); Assunto assunto = new Assunto(1, Programação ); em.merge(assunto); em.gettransaction().commit(); Mediador: Rui Rossi dos Santos Slide 26
JPA & Hibernate Operações de persistência com um EntityManager: Recuperar objetos utilizando uma NamedQuery Query query = em.createnamedquery( Assunto.findAll ); List<Assunto> lista = query.getresultlist(); Mediador: Rui Rossi dos Santos Slide 27
JPA & Hibernate Anotações associadas às classes Java: @Entity: indica que a classe é uma entidade persistente. @Table: identifica a tabela correspondente à classe. Opcional para classes com nome idêntico ao da tabela. name: especifica o nome da tabela. Mediador: Rui Rossi dos Santos Slide 28
JPA & Hibernate Anotações associadas às classes Java : @NamedQueries: define um conjunto de consultas pré-definidas vinculadas à entidade. @NamedQuery: define uma consulta pré-definidas vinculada à entidade. name: especifica o nome da consulta. query: especifica a consulta a ser realizada. Mediador: Rui Rossi dos Santos Slide 29
JPA & Hibernate Anotações aplicáveis aos atributos das classes: @Column: identifica a coluna correspondente ao atributo. Opcional para atributos com nome idêntico à coluna da tabela. name (String): especifica o nome da coluna da tabela. nullable (boolean): indica se o valor pode ser nulo. length (int): tamanho máximo da coluna. unique (boolean): indica se a coluna exige valores únicos. @Basic: especifica configurações básicas do atributo. optional: indica se o campo permite valores nulos. Mediador: Rui Rossi dos Santos Slide 30
JPA & Hibernate Anotações aplicáveis aos atributos das classes: @Id: indica qual é o atributo identificador da classe. Toda classe deve ter um. Deve corresponder à chave primária da tabela. @GeneratedValue: indica que o valor do atributo é gerado no banco. strategy: indica o tipo de geração empregado. GenerationType.IDENTITY: campo AUTO_INCREMENT no MySQL. Mediador: Rui Rossi dos Santos Slide 31
JPA & Hibernate Anotações para mapeamento de associações: @OneToOne @OneToMany @ManyToOne @ManyToMany @JoinTable @JoinColumn Mediador: Rui Rossi dos Santos Slide 32
JPA & Hibernate Anotações para chaves compostas: @Embeddable @EmbeddedId Mediador: Rui Rossi dos Santos Slide 33
JPA & Hibernate Passos para a criação de uma aplicação Java para a Web: Criação do banco de dados. Criação de uma conexão com o banco no NetBeans. Criação de um projeto de aplicação para a Web no NetBeans. Configuração do projeto no NetBeans. Adição das bibliotecas do Hibernate e JPA. Adição do driver JDBC do SGBD a ser utilizado. Criação de uma unidade de persistência (persistence.xml) Criação das classes de entidade. Criação de um DAO genérico. Criação de um servlet. Criação dos componentes da camada de apresentação. Mediador: Rui Rossi dos Santos Slide 34
Segundo Exemplo Passo 1: criação do banco de dados (introjpa) Mediador: Rui Rossi dos Santos Slide 35
Segundo Exemplo Passo 2: criação de uma conexão no NetBeans URL: jdbc:mysql://localhost:3306/introjpa Driver: MySQL Connector Host: localhost Porta: 3306 Banco: introjpa Usuário: root Nome: IntroJPA Mediador: Rui Rossi dos Santos Slide 36
Segundo Exemplo Passo 3: criação de um projeto no NetBeans Escolha do projeto: Categoria: Java Web Projeto: Aplicação Web Nome e local: Nome: IntroJPA1 Servidor e configurações: Servidor: Tomcat 6.0.20 Versão do Java: Java EE 5 Contexto: /IntroJPA1 Frameworks: nenhum Mediador: Rui Rossi dos Santos Slide 37
Segundo Exemplo Passo 4: configuração do projeto Modificar a codificação de caracteres para ISO-8859-1. Adicionar bibliotecas: Hibernate JPA MySQL JDBC Driver Mediador: Rui Rossi dos Santos Slide 38
Segundo Exemplo Passo 5: criação uma unidade de persistência (persistence.xml) Tipo do arquivo: Categoria: Persistence Tipo: Unidade de persistência Provedor e banco de dados: Nome da unidade de persistência: HibernatePU Biblioteca de persistência: Hibernate Conexão: IntroJPA Estratégia de geração de tabela: Nenhum Mediador: Rui Rossi dos Santos Slide 39
Segundo Exemplo Passo 5: criação uma unidade de persistência (persistence.xml) Acrescentar configurações para visualizar instruções SQL: <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> Mediador: Rui Rossi dos Santos Slide 40
Segundo Exemplo Passo 5: criação uma unidade de persistência (persistence.xml) Mediador: Rui Rossi dos Santos Slide 41
Segundo Exemplo Passo 6: criação das classes de entidade Tipo do arquivo: Categoria: Persistence Tipo: Classe de entidade do banco de dados Tabela do banco de dados: Conexão: IntroJPA Tabelas selecionadas: TODAS Incluir tabelas relacionadas: SIM Classes de entidade: Manter nomes das classes mapeados a partir das tabelas Pacote: br.pro.ruirossi.introjpa.entidades Gerar anotações de consulta nomeada para campos persistentes Mediador: Rui Rossi dos Santos Slide 42
Segundo Exemplo Passo 6: criação das classes de entidade Opções do mapeamento: Obter associações: padrão (lento) Ansioso (eager): carregar coleções automaticamente Lento (lazy): carregar coleções somente quando são acessadas Tipo de coleção: java.util.list Mediador: Rui Rossi dos Santos Slide 43
Segundo Exemplo Passo 6: criação das classes de entidade Adicionar as classes de entidade à unidade de persistência Mediador: Rui Rossi dos Santos Slide 44
Segundo Exemplo Passo 7: criação de um DAO Genérico - - + + + + + + emf em GenericDAO : EntityManagerFactory : EntityManager GenericDAO () persistir (T objeto) remover (T objeto) alterar (T objeto) executenamedquery (String namedquery) findbyid (Class classe, Object id) : void : void : void : List<T> : T <T> Mediador: Rui Rossi dos Santos Slide 45
Segundo Exemplo Passo 8: criação de um servlet (Controlador.java) Tipo do arquivo: Categoria: Web Tipo: Servlet Nome e local: Nome da classe: Controlador Pacote: br.pro.ruirossi.introjpa.servlets Configurações: Nome do servlet: Controlador URL: /controlador Mediador: Rui Rossi dos Santos Slide 46
Segundo Exemplo Passo 8: criação de um servlet (Controlador.java) Preparar o servlet para realizar cinco operações: Inserir novos assuntos Alterar um assunto existente Excluir um assunto existente Recuperar um assunto existente pela sua identificação Gerar o relatório com todos os assuntos registrados Controlador # # # + + + + + doget (HttpServletRequest request, HttpServletResponse response) dopost (HttpServletRequest request, HttpServletResponse response) processrequest (HttpServletRequest request, HttpServletResponse response) assuntoinsert (HttpServletRequest request) assuntofindall (HttpServletRequest request) assuntoupdate (HttpServletRequest request) assuntodelete (HttpServletRequest request) assuntofindbyid (HttpServletRequest request) : void : void : void : String : String : String : String : String Mediador: Rui Rossi dos Santos Slide 47
Segundo Exemplo Passos 9: camada de apresentação index.jsp: menu inicial. sucesso.jsp: confirmação da realização de uma operação. erro_tratado.jsp: informações sobre erro ocorrido. assunto_incluir.jsp: formulário para incluir um novo assunto. assunto_alterar.jsp: formulário para alterar um assunto. assunto_excluir.jsp: formulário para excluir um assunto. assunto _consultar.jsp: formulário para consultar um assunto. assunto_relatorio.jsp: relatório de assuntos cadastrados. Mediador: Rui Rossi dos Santos Slide 48
Passos 9: execução e testes Segundo Exemplo Mediador: Rui Rossi dos Santos Slide 49
Passos 9: execução e testes Segundo Exemplo Mediador: Rui Rossi dos Santos Slide 50
Exercício 4 Crie uma cópia do projeto IntroJPA1 e chame-o de IntroJPA2. Prepare este projeto para realizar as seguintes operações: Realizar o cadastro de novos autores. Alterar os cadastros de autores. Excluir cadastros de autores existentes. Recuperar um cadastro de autor pela sua identificação. Gerar o relatório com todos os autores registrados. Mediador: Rui Rossi dos Santos Slide 51
Terceiro Exemplo Projeto: IntroJPA3 Funcionalidades adicionadas: Cadastro de autores Cadastro de livros Classes mais importantes para o estudo: br.pro.ruirossi.entidades.autor br.pro.ruirossi.entidades.livro br.pro.ruirossi.servlets.autorcontroller br.pro.ruirossi.servlets.livrocontroller Mediador: Rui Rossi dos Santos Slide 52
Exercício 5 Crie uma nova aplicação Java para a web, chamada GeoMundo, que realize as operações de persistência utilizando JPA e Hibernate. Esta aplicação deve realizar as seguintes operações: Cadastro de continentes: identificação, nome e área. Cadastro de idiomas: identificação e nome. Cadastro de países: identificação, nome, nacionalidade, área, população, continente e idiomas. Mediador: Rui Rossi dos Santos Slide 53
Exercício 5 Passos para a criação da aplicação: Crie o banco de dados. Crie uma conexão com o banco no NetBeans. Crie um projeto de aplicação para a Web no NetBeans. Configure o projeto no NetBeans. Adicione as bibliotecas do Hibernate e JPA. Adicione o driver JDBC do SGBD a ser utilizado. Crie uma unidade de persistência (persistence.xml) Crie as classes de entidade. Crie um DAO genérico. Crie um servlet para cada operação de cadastro. Crie os JSPs da camada de apresentação. Mediador: Rui Rossi dos Santos Slide 54