Prévia do material em texto
22/08/2023, 11:14 UNIP - Universidade Paulista : DisciplinaOnline - Sistemas de conteúdo online para Alunos. https://online.unip.br/imprimir/imprimirconteudo 1/8 Este módulo aborda a conexão e instruções de acesso a banco de dados através do framework Hibernate. O framework Hibernate é um mecanismo de fácil aplicação que permite a persistência de objetos em banco de dados relacionais de maneira transparente. Desta forma, não se faz necessário a construção de comandos SQL, evitando a inclusão destas instruções em seu código, bem como, preocupar-se com o mapeamento do resultado de suas consultas para objetos. O mapeamento de forma manual exige que o desenvolvedor se preocupe com questões como verificar se um atributo é nulo, se o seu valor foi alterado, construir cada um dos comandos SQL para inserir, atualizar ou apagar uma linha na tabela, conhecer as peculiaridades de cada banco de dados (Oracle, MySQL, SQL Server, e outros), como por exemplo, o formato de datas ou com o mecanismo de geração de valores para chaves primárias, e ainda, estabelecer uma conexão JDBC com o banco de dados, para só então poder submeter os comandos SQL gerados. No caso de recuperação dos dados do banco de dados para a aplicação, é preciso fazer o caminho inverso, ou seja, manipular os dados retornados, criar o objeto para o qual se deseja atribuir tais valores, e atribuir o valor de cada coluna do banco de dados para o correspondente atributo. Para apresentar a aplicação dos conceitos é apresentada uma aplicação que permite a criação de objetos da classe Pessoa, e a sua persistência em uma tabela já existente no banco de dados, com o nome pessoas. Para configurar o mapeamento dos atributos da classe para a tabela do banco de dados, é utilizado um recurso do Java chamado annotations (Anotações). São elas que indicam para o Hibernate como manipular os dados. Abaixo demonstra-se a classe Pessoa já devidamente anotada, com as configurações necessárias para que os objetos criados a partir desta sejam persistidos no banco de dados: @Entity @Table(name="pessoas") public class Pessoa { @Id // @GeneratedValue(strategy=GenerationType.IDENTITY) // @GeneratedValue(strategy = GenerationType.SEQUENCE) @GeneratedValue(strategy = GenerationType.AUTO) private Long id; 22/08/2023, 11:14 UNIP - Universidade Paulista : DisciplinaOnline - Sistemas de conteúdo online para Alunos. https://online.unip.br/imprimir/imprimirconteudo 2/8 @Column(length=100,nullable=false) private String nome; @Column(nullable=false) private String cpf; private String rg; @Temporal(TemporalType.DATE) private Date dataNascimento; A anotação @Entity indica para o Hibernate que a classe Pessoa deve ser armazenada em uma tabela, e a @Table(name="pessoas") configura o nome da tabela como pessoas. Com a anotação @Id configura um atributo como sendo a chave primária da tabela. Para a definição de como a chave primária será controlada pelo sistema, utiliza-se a anotação @GeneratedValue(strategy=GenerationType.AUTO), que faz com que os valores sejam gerados automaticamente pelo mecanismo do próprio banco de dados. Para esta anotação é possível utilizar também as opções GenerationType.IDENTITY e GenerationType.SEQUENCE, mas com isso, perde-se uma das vantagens na utilização do Hibernate, que é a portabilidade. Para cada atributo, é possível definir o nome da coluna, além de outras informações como obrigatoriedade de preenchimento e seu tamanho, e para isso, utiliza-se a anotação @Column. Para o desenvolvimento do exemplo, o banco de dados escolhido foi o MySQL, um banco de dados livre, grátis e simples de instalar e usar. O acesso ao banco de dados no Java se dá através de uma conexão JDBC, e para isso, é necessário efetuar o download do driver do banco ao qual se pretende conectar. O driver JDBC do MySQL pode ser baixado através do endereço http://linorg.usp.br/mysqlDownloads/Connector-J/mysql-connector-java-5.1.13.zip. Do arquivo baixado, é necessário extrair o arquivo mysql-connector-java-5.1.13-bin.jar, que deve ser adicionado ao classpath da aplicação. Para configurar a conexão com o banco de dados, o Hibernate precisa saber como se conectar a ele, e isso é feito através de um arquivo chamado persistence.xml, que deve ficar dentro de uma pasta nomeada como META-INF, localizada na raiz do projeto. Este arquivo contém as definições de banco de dados: <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" 22/08/2023, 11:14 UNIP - Universidade Paulista : DisciplinaOnline - Sistemas de conteúdo online para Alunos. https://online.unip.br/imprimir/imprimirconteudo 3/8 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" > <persistence-unit name="artigo"> <properties> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="admin" /> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/artigo" /> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <property name="hibernate.max_fetch_depth" value="3" /> <property name="hibernate.hbm2ddl.auto" value="create-drop" /> <property name="hibernate.show_sql" value="true" /> </properties> </persistence-unit> </persistence> Os itens de maior atenção deste arquivo são: · <persistence-unit name="artigo"> - Configura o nome do contexto que será utilizado pela aplicação e as propriedades abaixo definem as configurações de acesso ao banco de dados. · javax.persistence.jdbc.driver – Nome completo da classe do driver JDBC do banco de dados. · javax.persistence.jdbc.user – Nome do usuário que será utilizado para estabelecer a conexão com o banco de dados. · javax.persistence.jdbc.password – Senha do usuário. · javax.persistence.jdbc.url – String de conexão com o banco de dados. 22/08/2023, 11:14 UNIP - Universidade Paulista : DisciplinaOnline - Sistemas de conteúdo online para Alunos. https://online.unip.br/imprimir/imprimirconteudo 4/8 · hibernate.dialect – Configura o dialeto que o Hibernate utilizará para a montagem dos comandos SQL. O arquivo persistence.xml foi configurado utilizando-se parâmetros que permitem a conexão com o MySQL, e conforme afirmado antes, uma das vantagens em se utilizar o Hibernate é permitir a troca do banco de dados da aplicação de maneira praticamente transparente, bastando para isso alterar os parâmetros de conexão, sem que seja necessário alterar uma só linha de código fonte do sistema de informação sendo desenvolvido, deste modo, a figura abaixo demonstra a utilização do banco de dados Oracle. <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" > <persistence-unit name="artigo"> <properties> <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" /> <property name="javax.persistence.jdbc.user" value="hr" /> <property name="javax.persistence.jdbc.password" value="hr" /> <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE"/> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" /> <property name="hibernate.max_fetch_depth" value="3" /> <property name="hibernate.hbm2ddl.auto" value="create-drop" /> <property name="hibernate.show_sql" value="true" /> </properties> </persistence-unit> </persistence> 22/08/2023, 11:14 UNIP - Universidade Paulista : DisciplinaOnline - Sistemas de conteúdo online para Alunos. https://online.unip.br/imprimir/imprimirconteudo 5/8 As mudanças se resumem à: · O driver JDBC, conteudo da linha value localizado na primeira property. · A string de conexão com o banco de dados, conteudo da linha value localizado na quarta property. · O dialeto utilizado pelo Hibernate na montagem dos comando SQL, conteudo da linha value localizado na última property. · E por fim, o usuário e senha utilizado pra acessar a o banco de dados. Deve-se adicionar ao classpath da aplicação, o arquivo ojdbc14.jar referente ao driver JDBC do Oracle que pode ser baixado através do endereço http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-10201-088211.html. Com a aplicação configurada através do arquivo persistence.xml, é necessário obter uma conexão com o banco de dados para permitir que a aplicação se comunique com o banco de dados, e para isso, é utilizado um objeto do tipo EntityManager. A classe EntityManager é disponibilizada pelo Hibernate, e é a classe responsável pela manipulação dos objetos que devem ser salvos e recuperados do banco de dados. Para facilitar a criação de objetos EntityManager, foi construída a classe EntityManagerProvider, que encapsula todo o trabalho necessário para a criação de tais objetos, classe esta demonstrada abaixo: public class EntityManagerProvider { private static EntityManagerFactory emf = null; private EntityManagerProvider() { } public static EntityManager getEntityManagerInstance() { if (emf == null) { emf = Persistence.createEntityManagerFactory("artigo"); } return emf.createEntityManager(); } } 22/08/2023, 11:14 UNIP - Universidade Paulista : DisciplinaOnline - Sistemas de conteúdo online para Alunos. https://online.unip.br/imprimir/imprimirconteudo 6/8 O ponto que precisa ser destacado nessa classe é a linha emf = Persistence.createEntityManagerFactory("artigo"); O parâmetro utilizado na criação do objeto tem o valor “artigo”. Este é exatamente o nome definido na propriedade persistence-unit do arquivo persistence.xml, ou seja, é através deste parâmetro que o Hibernate entende em que banco de dados deve estabelecer a conexão, e com quais parâmetros. A classe EntityManager disponibiliza métodos pelos quais os objetos podem ser manipulados: remove: Exclui no banco de dados o registro na tabela referente ao objeto passado como parâmetro. createQuery: Permite a consulta de dados persistidos no banco de dados, recuperando- os na forma de objetos. persist: Envia os dados do objeto criado ou alterado para o banco de dados. find: Realiza uma busca por um objeto através de seu identificador. getTransaction: Obtém uma referência de um objeto do tipo EntityTransaction, o qual permite o controle das transações. Alguns dos métodos disponibilizados pela classe são: begin: Método que indica o início de um bloco que deve ser controlado em um contexto transacional. commit: Método que permite efetivar todas as ações executadas no banco de dados desde a execução do método begin. rollback: Método que permite desfazer todas as ações executadas no banco de dados desde a execução do método begin. Apesar da classe EntityManager possuir métodos bem definidos para a manipulação dos objetos, ainda existe a necessidade de iniciar a transação, executar a ação desejada sobre o objeto e encerrar a transação, confirmando ou cancelando as ações. Para eliminar essa responsabilidade do desenvolvedor, uma classe seguindo o padrão DAO é a solução, conforme já apresentado. Exercício 1: Considere o excerto a seguir: Em uma aplicação que utiliza Hibernate, uma I representa uma determinada configuração de repositório de dados (data-store) lógicos. A I I tem o mesmo papel em uma aplicação JPA, e configura-se uma II I com arquivos de configuração ou em código da aplicação assim como se configuraria uma V I . A configuração de uma V , junto com um conjunto de metadados de mapeamento (normalmente classes anotadas), é chamada de VI . 22/08/2023, 11:14 UNIP - Universidade Paulista : DisciplinaOnline - Sistemas de conteúdo online para Alunos. https://online.unip.br/imprimir/imprimirconteudo 7/8 As lacunas I, II, III, IV, V e VI devem ser preenchidas, correta e respectivamente, por: A) Java Transaction API - EntityManager - EntityManagerFactory - EntityTransaction - Java Transaction API - persistence unit. B) EntityManager - EntityManager - EntityManagerFactory - EntityTransaction - SessionFactory - driver. C) Connection - DriverManager - DriverManager - Connection - Connection - statement. D) EntityTransaction - Connection - Connection - SessionFactory - Java Transaction API - persistence unit. E) SessionFactory - EntityManagerFactory - EntityManagerFactory - SessionFactory - EntityManagerFactory - unidade de persistência. Comentários: Essa disciplina não é ED ou você não o fez comentários Exercício 2: Por suas características, Hibernate 3.5 constitui uma ferramenta com a finalidade de realizar o seguinte tipo de mapeamento: A) objeto/relacional para Java. B) gerencial/operacional para sites interativos textuais. C) 22/08/2023, 11:14 UNIP - Universidade Paulista : DisciplinaOnline - Sistemas de conteúdo online para Alunos. https://online.unip.br/imprimir/imprimirconteudo 8/8 gerencial/operacional para sites interativos hipermídia. D) entidade/relacionamento para modelagem de dados. E) lógico/físico para desenvolvimento por meio da prototipação. Comentários: Essa disciplina não é ED ou você não o fez comentários Exercício 3: Linguagem de queries, fornecida pelo Hibernate, que é similar em aparência ao SQL e que, no entanto, é orientada a objeto e compreende noções como herança, polimorfismo e associação. Trata-se de: A) HiBD-QL. B) OOQL. C) ORM-QL. D) HQL. E) JEEQL. Comentários: Essa disciplina não é ED ou você não o fez comentários