Integrando o Hibernate com o Spring



Documentos relacionados
Curso de Java. Acesso a banco de dados através do Hibernate. Todos os direitos reservados Klais

HIBERNATE EM APLICAÇÃO JAVA WEB


Persistência de dados com JPA. Hélder Antero Amaral Nunes

TUTORIAL SPRING SECURITY PROGRAMAÇÃO COM FRAMEWORKS Responsáveis: Ana Luíza Cruvinel, Maikon Franczak e Wendel Borges

UFG - Instituto de Informática

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro Maio/ 2015

JPA: Persistência padronizada em Java

Acesso a Banco. Conexão em Java. Conexão em Java. Programação Orientada a Objetos Profa. Cristiane e Prof. Daniel

DW2 Desenvolvimento Web 2

JPA Passo a Passo. Henrique Eduardo M. Oliveira henrique@voffice.com.br. Globalcode Open4Education

Parte II Persistência entre Modelos de Dados

UFG - Instituto de Informática

Programação de Computadores - I. Profª Beatriz Profº Israel

Java para Desenvolvimento Web

Parte I. Demoiselle Mail

WebApps em Java com uso de Frameworks

Resolvendo objeto-relacional impedance mismatch com hibernate

Kerio Exchange Migration Tool

Persistindo dados com TopLink no NetBeans

INTRODUÇÃO 12. DOCUMENTAÇÃO INTRODUÇÃO INTRODUÇÃO

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

Aula 03 - Projeto Java Web

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse

No Fedora, instalamos os pacotes "mysql" e "mysql-server", usando o yum:

JDBC. Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos.

Figura 1.1 Código de inserção não baseado em Hibernate. Figura 1.2 Código de inserção baseado em Hibernate

Figura 1. A Classe Java

Java e Banco de Dados: JDBC, Hibernate e JPA

Feature-Driven Development

Persistência de Dados em Java com JPA e Toplink

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Enterprise Java Beans

Java para WEB. Servlets

Uma Abordagem sobre Mapeamento Objeto Relacional com Hibernate

JSF - Controle de Acesso FERNANDO FREITAS COSTA

Construindo portais com Plone

Java com Banco de Dados Posgree

Desenvolvimento de aplicação web com framework JavaServer Faces e Hibernate

Google Drive. Passos. Configurando o Google Drive

Programando em PHP. Conceitos Básicos

DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0

WebWork 2. João Carlos Pinheiro.

Manual de configuração do sistema

Manipulação de Banco de Dados com Java 1. Objetivos

Classes de Entidades Persistentes JDB

Documentação Usando o Javadoc

Google Drive: Acesse e organize seus arquivos

Aula 5. Carlos Eduardo de Carvalho Dantas

Laboratório de Computação VI JAVA IDL. Fabricio Aparecido Breve

Criando Banco de Dados, Tabelas e Campos através do HeidiSQL. Prof. Vitor H. Migoto de Gouvêa Colégio IDESA 2011

Instalação do ByYou ESB. Guia de Instalação e Atualização do ByYou ESB

Persistência de Classes em Tabelas de Banco de Dados

Fernando Kasten Peinado

Como foi exposto anteriormente, os processos podem ter mais de um fluxo de execução. Cada fluxo de execução é chamado de thread.

DWR DIRECTED WEB REMOTING

ABORDAGEM DE FRAMEWORKS PARA JSF QUE AUXILIAM O DESENVOLVIMENTO DE SOFTWARE

Mapeamento Lógico/Relacional com JPA

Ave: Manual do usuário

DESENVOLVIMENTO PARA DISPOSITIVOS MÓVEIS. PROFª. M.Sc. JULIANA H Q BENACCHIO

PadrãoIX. Módulo II JAVA. Marcio de Carvalho Victorino. Servlets A,L,F,M

Unidade 7: Middleware JDBC e Java DB Prof. Daniel Caetano (Fonte: Tutorial Oficial do NetBeans)

Nesse artigo abordaremos os principais aspectos de instalação e uso do NTOP no Fedora Core 4.

Criar uma aplicação JPA2 com EclipseLink e H2

INSTALANDO E CONFIGURANDO O MY SQL

Breve introdução. Uma breve introdução. Simplicidade e Poder. Rápido Dinâmico Robusto

JDBC Java Database Connectivity

O Primeiro Programa em Visual Studio.net

Manual Integra S_Line

Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL

Etc & Tal. Volume 2 - Número 1 - Abril 2009 SBC HORIZONTES 44

Acessando um Banco de Dados

MAPEAMENTO OBJETO RELACIONAL: UM ESTUDO DE CASO

ArpPrintServer. Sistema de Gerenciamento de Impressão By Netsource Rev: 02

GEPLANES GESTÃO DE PLANEJAMENTO ESTRATÉGICO MANUAL DE INSTALAÇÃO DO GEPLANES EM UM AMBIENTE WINDOWS

Prevayler. Perola. André Luís Sales de Moraes Juliana Keiko Yamaguchi Tatiana Yuka Takaki

Banco de Dados. Sérgio Luiz Ruivace Cerqueira

1 Criar uma entity a partir de uma web application que usa a Framework JavaServer Faces (JSF)

Spring Framework Luiz Daniel Creão Augusto Sistemas de Middleware Avançados IME-USP /02

02 - Usando o SiteMaster - Informações importantes

Índice: Nitgen do Brasil

Manual do Usuário. Tag List. Tag List Generator. smar FIRST IN FIELDBUS JUL / 02. Tag-List VERSÃO 1.0 TAGLSTC3MP

Programação para Dispositivos Móveis

CSAU Guia: Manual do CSAU 10.0 como implementar e utilizar.

Programação para Android. Aula 06: Activity, menus e action bar

JDBC (Java Database Connectivity) Padrão de Projeto DAO (Data Access Object) Roteiro para instalação do banco de dados e do driver JDBC

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Linguagem de Programação JAVA. Professora Michelle Nery Nomeclaturas

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Como instalar o Kobo Desktop para Windows Como instalar o Kobo Desktop para Mac Como classificar a sua biblioteca...

Lidando de Forma Eficiente com Validações Locais de Objetos

Procedimentos para Configuração do Ambiente J2EE e J2SE em Ambiente Windows

Usar Atalhos para a Rede. Logar na Rede

Omega Tecnologia Manual Omega Hosting

Criando documentação com javadoc

Sistemas Operacionais

Transcrição:

Integrando o Hibernate com o Spring O Hibernate é uma solução open-source para Mapeamento Objeto/Relacional (ORM). ORM é uma técnica de mapeamento que consistem em mapear um modelo de Objetos para um modelo Relacional (usualmente representado por uma base de dados SQL). O Hibernate foi criado em meados de 2001 por Gavin King e outros desenvolvedores. Desde então, o Hibernate vem se tornando um popular framework de persistência na comunidade Java. Ele se tornou tão popular de fato, que as próximas versões do EJB e do JDO estarão usando Hibernate como referência. As razões para esta popularidade são devido a ótima documentação, facilidade de uso, exceletes recursos e um esperto gerenciamento de projeto. Hibernate libera você de codificar manualmente o JDBC. Melhor do que usar SQL e JDBC, você pode usar domínios de objetos (normalmente POJOs) e de forma simples criar arquivos de mapeamento baseados em XML. Estes arquivos indicam quais campos (em um objeto) serão mapeados para suas respectivas colunas (na tabela). O Hibernate possui uma poderosa linguagem de pesquisa chamada Hibernate Query Language (HQL). Esta linguagem permite a você escrever SQL, mas também usar semânticas orientadas a objeto. Uma das melhores partes sobre essa linguagem de pesquisa é que você pode literalmente adivinhá-la. A interface Session do Hibernate é similar a uma conexão com o banco de dados, ela tem de ser aberta e fechada nos tempos apropriados para prevenir erros e leaks de memória. Na minha opinião, a maior vantagem de usar Spring com Hibernate é que você não tem de gerenciar as aberturas e fechamentos das Sessions. Nota: O suporte as classes do Hibernate no Spring estão localizados nos pacotes org.springframework.orm.hibernate e org.springframework.orm.hibernate.support. Dependências O Hibernate possui algumas bibliotecas de terceiros da qual ele depende. Todas elas estão disponíveis como parte do download do Hibernate. Abaixo estão os JARs incluindo no download do Hibernate 2.1.6. Todas elas são requeridas, exceto as marcadas como opcional. O Spring requer o Hibernate 2.1 ou superior. hibernate2.jar: core do Hibernate c3p0-0.8.4.5.jar: Pool de conexão básico para executar testes unitários cglib-full-2.0.2.jar: Biblioteca geradora de código para criação de proxies para classes persistentes. dom4j-1.4.jar: biblioteca XML para parse de arquivos de configuração e mapeamento. ehcache-0.9.jar: Cache puro em Java, cache padrão do Hibernate. jta.jar: Java Transaction API. odmg-2.0.1.jar: Base para o mapeamento de produtos objeto-relacional. www.javafree.org Por Leonardo Lindermann 1

(opcional) oscache-2.0.1.jar e (cluster-aware) swarmcache-1.0rc2.jar: Implementações de caches alternativos. Tipo: Enquanto o Spring não suporta o Hibernate 3 (agora em beta), um patch está disponível. Configuração Para tornar seus objetos persistentes com Hibernate, primeiro crie um arquivo de mapeamento (Este capítulo assume que você já criou anteriormente um POJO User em src/org/model, com as propriedades id, firstname e lastname. 1. No diretório src/org/model, crie um arquivo User.hbm.xml com o conteúdo da listagem 1.0. Listagem 1.0 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <class name="org.model.user" table="app_user"> <id name="id" column="id" unsaved-value="0"> <generator class="increment"/> </id> <property name="firstname" column="first_name" not-null="true"/> <property name="lastname" column="last_name" not-null="true"/> </class> </hibernate-mapping> No mapeamento acima, o elemento <id> usa increment para indicar o valor máximo mais 1 para a chave primária gerada. O tipo gerador increment não é recomendado para cluster. Felizmente, o Hibernate possui muitas outras opções. 2. Crie um arquivo applicationcontext-hibernate.xml no diretório web/web-inf e adicione uma definição bean para um DataSource. Você pode usar um applicationcontext*.xml existente como um template. Este arquivo deverá possuir spring-beans.dtd e o elemento raiz <beans> definido antes da definição bean. O bean datasource neste exemplo usa uma base de dados HSQL, que é um banco de dados puramente Java que roda a partir de um simples arquivo hsqldb.jar localizando no diretório web/web-inf/lib. Mais tarde você irá trocar ele pelo MySQL para ver como é fácil a troca de banco de dados. Veja a listagem 1.1. www.javafree.org Por Leonardo Lindermann 2

Listagem 1.1 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="datasource" class="org.springframework.jdbc.datasource. DriverManagerDataSource"> <property name="driverclassname"> <value>org.hsqldb.jdbcdriver</value> <property name="url"> <value>jdbc:hsqldb:db/app</value> <property name="username"><value>sa</value> <property name="password"><value></value> </bean> <!-- Add additional bean definitions here --> </beans> O DriverManagerDataSource é um simples DataSource que configura o Driver JDBC através das propriedades do bean. Você também pode configurar um DataSource JNDI se você preferir use seu container DataSource pré-configurado. Por exemplo, uma estratégia comum é usar o DriverManagerDataSource para teste, e o DataSource JNDI (veja a listagem 1.2) para produção. Listagem 1.2 <bean id="datasource" class="org.springframework.jndi.jndiobjectfactorybean"> <property name="jndiname"> <value>java:comp/env/jdbc/app</value> </bean> 3. Adicione uma definição bean sessionfactory, que depende do bean datasource prévio e de um arquivo de mapeamento. A propriedade dialect irá mudar baseada no banco de dados e a propriedade hibernate.hbm2ddl.auto cria um banco de dados onthe-fly quando a aplicação iniciar. Veja a listagem 1.3. www.javafree.org Por Leonardo Lindermann 3

Listagem 1.3 <bean id="sessionfactory" class="org.springframework.orm.hibernate. LocalSessionFactoryBean"> <property name="datasource"><ref bean="datasource"/> <property name="mappingresources"> <list> <value>org/model/user.hbm.xml</value> </list> <property name="hibernateproperties"> <props> <prop key="hibernate.dialect"> net.sf.hibernate.dialect.hsqldialect </prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </bean> Como uma alternativa ao mapeamento individual para cada arquivo.hbm.xml, use as propriedades mappingjarlocations ou mappingdirectorylocations para referirse a um arquivo JAR ou diretório. Você também pode usar um arquivo hibernate.cfg.xml para especificar suas configurações e apontar para ele usando uma propriedade configlocation. 4. Adicione uma definição bean transactionmanager que usa a classe Hibernate- TransactionManager do Spring. SessionFactoryUtils e HibernateTemplate são cientes das threads ligadas as Sessions e irão participar em cada uma das transações automaticamente. É necessário usar uma das duas para que o Hibernate suporte o mecanismo de controle transacional. Veja a listagem 1.4. Listagem 1.4 <bean id="transactionmanager" class="org.springframework.orm.hibernate. HibernateTransactionManager"> <property name="sessionfactory"> <ref local="sessionfactory"/> </bean> O UserHibernateDAO ou UserDAOTest não usa este bean especificamente, mas a definição bean usermanager a referência. www.javafree.org Por Leonardo Lindermann 4

5. Crie uma classe UserDAOHibernate.java em src/org/dao/hibernate (você precisa criar este diretório/package). Este arquivo estende HibernateDaoSupport e implementa UserDAO. Veja a listagem 1.5. Listagem 1.5 package org.dao.hibernate; // use your IDE to organize imports public class UserDAOHibernate extends HibernateDaoSupport implements UserDAO { public List getusers() { return gethibernatetemplate().find("from User"); public User getuser(long id) { User user = (User) gethibernatetemplate().get(user.class, id); if (user == null) { throw new ObjectRetrievalFailureException(User.class, id); return user; public void saveuser(user user) { gethibernatetemplate().saveorupdate(user); public void removeuser(long id) { Object user = gethibernatetemplate().load (User.class, id); gethibernatetemplate().delete(user); 6. Adicione uma definição bean para o userdao em applicationcontext-hibernate.xml. Veja a listagem 1.6. Listagem 1.6 <bean id="userdao" class="org.dao.hibernate.userdaohibernate"> <property name="sessionfactory"> <ref local="sessionfactory"/> </bean> www.javafree.org Por Leonardo Lindermann 5

Na classe UserDAOHibernate, HibernateTemplate faz a maior parte do trabalho. Usar templates para tratar chamadas de persistência é um enredo comum dentro das classes de suporte DAO do Spring. Note também os seguintes itens na classe UserDAOHibernate.java. O método getuser() usa HibernateTemplate().get(), que retorna null se ele não achar objetos que combinem. A alternativa é usar HibernateTemplate().load(), que lança uma exceção se ele não achar objetos. HibernateTemplate.get() é usado no método removeuser(), mas você pode facilmente usar get() em seu lugar. O método getuser() lança uma exceção ObjectRetrievalFailureException quando ele não achar um usuário. Ela não tem exceções checadas. Você provavelmente irá parar de escrever um monte de blocos try/catch com Hibernate. A variável logger já está definida em HibernateDaoSupport, permitindo um fácil logging em suas subclasses. Por exemplo, adicione o código na listagem 1.7 no final do método saveuser(). Listagem 1.7 if (logger.isdebugenabled()) { logger.debug("user's id set to: " + user.getid()); Configuração do MySQL Para trocar do HSQL para MySQL é muito simples. Graças ao Spring isso é simplesmente uma questão de ajuste na configuração. 1. Tenha certeza que o MySQL está instalado e rodando. Certifique-se que o driver JDBC do MySQL está no diretório web/web-inf/lib. 2. No applicationcontext-hibernate.xml, mude a propriedade bean datasource conforme o código da listagem 1.8: Listing 1.8 <property name="driverclassname"> <value>com.mysql.jdbc.driver</value> <property name="url"> <value>jdbc:mysql://localhost/myusers</value> <property name="username"><value>root</value> <property name="password"><value></value> www.javafree.org Por Leonardo Lindermann 6

www.javafree.org Por Leonardo Lindermann 7

O username root e o password vazio são default da instalação. Você deve ajustar isto conforme a sua instalação. Tipo: Você pode usar um bean PropertyPlaceHolderConfigurer para setar os valores das propriedades acima (não visto aqui). 3. Mude a propriedade hibernate.dialect do bean sessionfactory para o MySQL (veja a listagem 1.9): Listagem 1.9 <prop key="hibernate.dialect"> net.sf.hibernate.dialect.mysqldialect </prop> Caching Uma poderosa característica nos frameworks de persistência é a habilidade para cachear dados e evitar constantes viagens ao banco de dados. O objeto Session do Hibernate é um cache em nível de transação de persistência de dados, mas ele não controla caching por classe ou coleção-por-coleção na JVM ou em nível de cluster. Os exemplos seguintes mostram como configurar o EHCache para um caching em nível de JVM. Nota: EHCache é o cache default, assim você não precisa configurar uma entrada hibernate.cache.provider_class no applicationcontext-hibernate.xml. 1. A forma mais simples para ativar o caching para um objeto é adicionar uma tag <cache> no arquivo de mapeamento. Para fazer isso com o objeto User, adicione o elemento <cache> no arquivo User.hbm.xml localizando em src/org/model. Os valores opcionais são read-write e read-only. Você pode usar a segunda opção somente se você estiver se referindo a um objeto ou tabela que raramente muda. Veja a listagem 1.10 www.javafree.org Por Leonardo Lindermann 8

Listagem 1.10 <class name="org.model.user" table="app_user"> <cache usage="read-write"/> <id name="id" column="id" unsaved-value="0"> 2. (Opcional) Criar entradas no arquivo de configuração do EHCache para esta classe. Crie um arquivo ehcache.xml em web/web-inf/classes e insira nele o código XML da listagem 1.11. Listagem 1.11 <ehcache> <!-- Only needed if overflowtodisk="true" --> <diskstore path="java.io.tmpdir"/> <!-- Required element --> <defaultcache maxelementsinmemory="10000" ceternal="false" timetoidleseconds="120" timetoliveseconds="120" overflowtodisk="true"/> <!-- Cache settings per class --> <cache name="org.model.user" maxelementsinmemory="1000" eternal="false" timetoidleseconds="300" timetoliveseconds="600" overflowtodisk="true"/> </ehcache> 3. Para provar que seu objeto User está cacheado, ative o debug logging para o EHCache em web/web-inf/classes/log4j.xml. (veja a listagem 1.12): Listing 1.12 <logger name="net.sf.ehcache"> <level value="debug"/> </logger> A documentação de referência do Hibernate contém mais informações sobre como usar e configurar Caches de Segundo Nível. Em geral, o caching é algo que você não precisa configurar para na sua aplicação até que você tenha afinado seu banco de dados (ex: criação de índices). Esta implementação de cache tem como propósito somente demonstrar o seu funcionamento. www.javafree.org Por Leonardo Lindermann 9

Objetos com dependências Lazy-Loading Umas das muitas features do Hibernate é a habilidade para lazy-load de objetos dependentes. Por exemplo, se uma lista de usuários referir-se a uma coleção de objetos de cargos, você provavelmente não irá precisar que os cargos sejam carregados para exibir somente a lista de usuários. Marcando a coleção de cargos com lazyload= true, eles não serão carregados enquanto você não fizer nada com eles (usualmente em uma UI) Para usar esta feature com Spring, configure o OpenSessionInViewFilter em sua aplicação. Isto irá abrir uma sessão quando uma determinada URL é requisitada pela primeira vez e fechada quando terminado a carga da página. Para ativar esta feature, adicione o código XML da listagem 1.13 no arquivo web.xml: Listagem 1.13 <filter> <filter-name>hibernatefilter</filter-name> <filter-class>org.springframework.orm.hibernate. support.opensessioninviewfilter</filter-class> </filter> <filter-mapping> <filter-name>hibernatefilter</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping> Usando esta feature podemos causar o erro na Listagem 1.14 quando executarmos nossos testes unitários no DAO. Listagem 1.14 [junit] net.sf.hibernate.lazyinitializationexception: Failed to lazily initialize a collection - no session or session was closed Para arrumar isso, adicione o código na listagem 1.15 para os métodos setup() e teardown() do seu teste. www.javafree.org Por Leonardo Lindermann 10

Listagem 1.15 protected void setup() throws Exception { // the following is necessary for lazy loading sf = (SessionFactory) ctx.getbean("sessionfactory"); // open and bind the session for this test thread. Session s = sf.opensession(); TransactionSynchronizationManager.bindResource(sf, new SessionHolder(s)); // setup code here protected void teardown() throws Exception { // unbind and close the session. SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.getResource(sf); Session s = holder.getsession(); s.flush(); TransactionSynchronizationManager.unbindResource(sf); SessionFactoryUtils.closeSessionIfNecessary(s, sf); // teardown code here www.javafree.org Por Leonardo Lindermann 11