Parte I Resumo Rápido do Hibernate Nosso primeiro objetivo é permanecermos atualizados sobre o Hibernate o mais rápido possível. A maioria dos capítulos desta parte é de versões atualizadas do conteúdo de Hibernate: A Developer’s Notebook (O’Reilly), que reflete as principais mudanças que acompanharam o Hibernate 3. A amostra de código agora funciona com as versões mais atualizadas das ferramentas nas quais confiamos para fornecer um ambiente fácil, porém, realista para se trabalhar com o Hibernate. Também há um novo capítulo falando sobre a capacidade de usar anotações Java 5, ao invés de arquivos de mapeamento XML, para configurar os mapeamentos do Hibernate. Começar e seguir os exemplos é ainda mais fácil nesta nova versão do livro, pois adotamos o Maven para ajudar a baixar muitas das ferramentas e bibliotecas. Como esperamos que você perceba, não há desculpa para evitar mergulhar e experimentar tudo isso sozinho! Quando se sentir confortável com os fundamentos do Hibernate, a Parte II demonstrará como associar o Hibernate a outros ambientes, para que eles sejam ainda mais poderosos do que são quando trabalham sozinhos. Muito bem, é hora de mergulhar.... CAPÍTULO 1 Instalação e Configuração Ainda me surpreende como há tantas ferramentas JavaTM grandes, livres e de fonte aberta à disposição. Quando precisei de um serviço de mapeamento objeto/relacional de peso leve para um projeto de e-commerce JSP na virada do milênio, tive de construir o meu próprio. Ele evoluiu com os anos, desenvolveu características excelentes e únicas e o temos usado em uma grande variedade de contextos diferentes. Mas, quando descobri o Hibernate, nós o utilizamos para um novo desenvolvimento em vez de usá-lo para meu próprio sistema, já familiar (para felizmente admitir preconceitos). Isso revela o quanto ele é irresistível! Se estiver dando uma olhada neste livro, provavelmente está interessado em uma maneira poderosa e conveniente para unir os mundos dos objetos Java e dos bancos de dados relacionais. O Hibernate cumpre esse papel muito bem, sem ser tão complicado a ponto de tornar o aprendizado um desafio assombroso por si só. Para mostrar isso, este capítulo leva você até o ponto em que poderá brincar com o Hibernate e ver porque ele é tão cativante. Os últimos capítulos mostrarão como usar o Hibernate como parte de ambientes mais complexos tais como o Spring e o Stripes e também como usá-lo com outros bancos de dados. O objetivo deste primeiro capítulo é mostrar como é fácil reunir um ambiente básico e independente em que é possível explorar o Hibernate e fazer coisas verdadeiras com ele. Como conseguir uma Distribuição Ant Embora pareça surpreendente, o que você precisa, inicialmente, para colocar o Hibernate em funcionamento não tem nada a ver com o Hibernate em si. Primeiro você deve configurar um ambiente em que os exemplos funcionem. Ao fazer isso você obterá o agradável efeito de construir uma fundação sólida para qualquer projeto real do qual seja responsável. Caso ainda não utilize o Ant para gerenciar a construção, o teste, a execução e o empacotamento de seus projetos em Java, a hora de começar é agora. Os exemplos deste livro são dirigidos para Ant, por isso você precisará instalar Ant e tê-la em funcionamento para executá-los e experimentar com variações em seu próprio sistema, que é a melhor maneira de aprender. Em primeiro lugar, adquira uma Ant binária e instale-a. Por que me preocupar? Os exemplos utilizam Apache Ant por diversos motivos. Ele é conveniente e poderoso; é uma das ferramentas padrão construídas para o desenvolvimento baseado em Java; é de graça e é multiplataforma. Se você utilizar Ant, os exemplos funcionarão igualmente bem onde houver um ambiente Java, o que significa que os leitores deste livro não ficarão frustrados ou aborrecidos. Felizmente, isso também significa que podemos 3 fazer muito mais coisas excelentes com menos esforço - especialmente agora que várias ferramentas do Hibernate têm suporte Ant explícito, que mostrarei como dominar. (Devo notar que, hoje em dia, esses projetos mais complexos em Java geralmente utilizam o Maven*, que acrescenta muitas outras capacidades para o gerenciamento de projetos. Mas como foi necessário optar por um, no espírito de manter as coisas simples e verdadeiras para aquilo que acho útil, usei Ant com esses exemplos.) Se atualmente você usa Maven como uma ferramenta de construção, você perceberá que estamos usando Tarefas Ant do Maven para gerenciar as dependências de nossas construções Ant. Embora o Maven esteja ganhando força, o Ant continua sendo a ferramenta para construção mais amplamente usada em desenvolvimento de Java. O código de exemplo de cada capítulo também possui um arquivo pom.xml do Maven e pode ser compilado com ele. Em muitos casos, o arquivo de construção do Maven fornece a mesma funcionalidade que o arquivo build.xml de Ant usando o plug-in Maven Hibernate 3. No capítulo 12 você encontrará orientações para construir e distribuir aplicações do Hibernate utilizando o Maven por completo, mas a maioria dos exemplos deste livro foca Ant como uma ferramenta de construção, utilizando as Tarefas Ant Maven para aliviar o tédio de ter que procurar e baixar as várias bibliotecas que precisamos e as bibliotecas das quais elas, por sua vez, dependem. Para se beneficiar de todas essas capacidades, é necessário ter o Ant instalado e funcionando em seu sistema. Eu me questionava porque as pessoas preferiam Ant quanto poderiam usar Make. Agora vejo como Ant gerencia bem as construções de Java, e fico perdido sem ele. Como eu faço isso? Você pode baixar uma versão binária de Ant de http://ant.apache.org/bindownload.cgi. Role a página para baixo para encontrar a versão atual de Ant e baixe o arquivo em um formato adequado para você trabalhar. Escolha um lugar apropriado para ele e expanda o arquivo ali. O diretório no qual você expandiu o arquivo é conhecido como ANT_HOME. Digamos que você expandiu os arquivos compactados no diretório/usr/ local/apache-ant-1.7.0; se preferir, você pode criar um link simbólico para facilitar o trabalho com ele e evitar a necessidade de mudanças em qualquer configuração de ambiente quando você atualizar para uma versão mais nova. /usr/local % ln -s apache-ant-1.7.0 ant Uma vez que o Ant foi estabelecido, você precisa fazer algumas coisas para que ele funcione corretamente. É necessário acrescentar seu diretório bin na distribuição (neste exemplo, / usr/local/ant/bin) para o seu caminho de comando. Também é necessário configurar a variável do ambiente ANT_HOME para o diretório de nível superior que você instalou (neste exemplo, /usr/local/ant). Os detalhes sobre como executar esses passos, em diferentes sistemas operacionais, podem ser encontrados no manual do Ant (http://ant.apache. org/manual/) se precisar deles. Verifique sua versão Java É claro que também estou supondo que você tem um kit de desenvolvimento de software Java (SDK). Atualmente você deve estar usando, no mínimo, Java 5 , uma vez que oferece algumas características novas que são úteis. Se puder, opte pelo SDK estável mais recente. Tanto Java 5 quanto o Java 6 devem funcionar com todos os exemplos deste livro. Era possível utilizar a maior parte do Hibernate 2 com Java 1.3, mas *http://maven.apache.org/ 4 Dominando Hibernate geralmente era necessário reconstruir o arquivo Hibernate JAR usando o seu compilador 1.3. Podemos apenas imaginar que versões mais recentes dependem ainda mais fortemente de versões atuais de Java e Java 5 já está de lado tempo o suficiente e tem seus próprios benefícios, que nem mesmo investigaremos a compatibilidade com JDKs anteriores. Nossos exemplos são escritos supondo que você tenha ao menos o Java 5 – caso não tenha, sérios ajustes serão necessários: % java – version Java version “1.6.0_02” Java(TM) SE Runtime Environment (build 1.6.0_02-b06) Java HotSpot(TM) Client VM (build 1.6.0_02-b06, mixed mode, sharing) Você também deve usar uma distribuição Java licenciada verdadeira (como as da Sun ou Apple); nossos revisores técnicos acharam que a “semelhante” implementação GNU não executaria essas ferramentas e exemplos adequadamente quando estávamos escrevendo este livro. Esse ambiente GNU é o Java padrão carregado com diversas distribuições Linux. Se estiver trabalhando com uma distribuição Linux, pode ser que precise baixar o JDK da Sun e ter certeza que é essa a versão que está chamando (executando javaversion). Agora que a Sun possui Java de fonte aberta, esperamos que isso melhore no futuro e teremos JRE e JDK Sun por padrão, mesmo em distribuições puristas. Até lá, provavelmente será necessário fazer o donwload da versão mais recente. Quando este livro estava sendo escrito, as distribuições baseadas em Debian permitiam instalar um JDK Sun utilizando seus utilitários de gerenciamento de pacotes (tanto o 5 como o 6 estão disponíveis nas versões “Feisty Fawn” e “Gustsy Gibbon” do Ubuntu. Distribuições derivadas do Red Hat ainda necessitam baixar Java diretamente da Sun Microsystems. Sua quilometragem pode variar. Quando tudo isso estiver configurado, você pode começar a aquecer o Ant executando um teste e verificar se está tudo certo. % ant -version Apache Ant version 1.7.0 compiled on December 13 2006 O que aconteceu? Bem, não muito ainda, mas agora você está em uma posição onde poderá testar os exemplos que fornecermos mais tarde e usá-los como ponto inicial para os seus projetos reais do Hibernate. Se o Ant é novo para você, não seria má idéia ler o manual um pouquinho para ter noção de como ele funciona e o que ele pode fazer; isso ajudará dando sentido aos arquivos build.xml que usaremos em nossos exemplos. Se decidir (ou já sabe) que gosta do Ant e quer ir mais a fundo, você pode ler o manual† ou pegar o Ant: The Definitive Guide da O´Reilly (depois que terminar este livro, é claro)! Mas e... ...o Eclipse‡, o JBuilder§, o NetBeans¦ ou qualquer outro IDE Java? Bem, é claro que você pode usá-los, mas estará sozinho até que precisará integrar Ant no processo de construção. (Vários já utilizam Ant, então pode ser que você inicie mais à frente; para os outros, pode ser que passem por alguns momentos difíceis.) Se tudo falhar, use o IDE para desenvolver seu próprio código, mas chame o Ant da linha de comando quando precisar usar um de nossos scripts de construção. † http://www.ant.apache.org/manual/ ‡ http://www.eclipse.org/ § http://www.borland.com/jbuilder/ ║ http://www.netbeans.org/ Capítulo 1: Instalação e Configuração 5 Se estiver usando o Maven, você pode gerar os arquivos do projeto Eclipse IDE executando mvn eclipse:eclipse do diretório de exemplo de qualquer capítulo ou de diretórios de exemplo de níveis superiores. Se executar mvn eclipse:eclipse dos diretórios de exemplo, o Maven gerará um projeto Eclipse para cada configuração de exemplo do capítulo. No Capítulo 12 você encontrará instruções mais detalhadas para construir os exemplos em Maven e, no Capítulo 11, uma introdução para usar as ferramentas Eclipse do Hibernate mais profundamente. Como obter as Tarefas do Maven para Ant Espere – eu não disse que estamos utilizando Ant nos projetos de exemplo deste livro? Sim. Mas não é só isso. Embora o Ant permaneça como o fundamento para os exemplos deste livro, decidimos também, nessa segunda versão, melhorar as características de gerenciamento de dependência excelente do Maven através das Tarefas Maven para Ant. A primeira versão deste livro gastou páginas preciosas fornecendo instruções para baixar e arrumar toda a hospedagem das bibliotecas de terceiros: tudo do Jakarta Commons Lang para CGLIB. (E pela sua perspectiva, isso significa que você gastaria muitos minutos preciosos seguindo as instruções com cuidado e de forma tediosa.) Figura 1-1 Link do download para as Tarefas do Maven para Ant no site do Maven Nesta versão declaramos as dependências de nossos projetos em nosso arquivo build.xml e deixamos o Maven tomar conta do download e do gerenciamento de nossas dependências. Isso economiza toneladas de passos e de tempo. Agora é hora de instalar as Tarefas do Maven para Ant. Como eu faço isso? Existem duas maneiras de integrar as Tarefas do Maven para Ant: a primeira é baixar o JAR requisitado no diretório lib de Ant e a segunda é incluir a antlib através da declaração typedef em um arquivo de construção Ant. Vamos utilizar o método anterior e baixar o maven-ant-tasks-2.0.8.jar no diretório lib de 6 Dominando Hibernate Ant porque ele requer uma quantidade mínima de trabalho no arquivo build.xml do nosso exemplo e facilita o compartilhamento de vários projetos. Criaremos build.xml mais tarde. Primeiro vamos baixar o arquivo JAR necessário do site# do Maven. Na primeira página você verá um link para download das Tarefas do Maven para Ant (veja a Figura 1-1). Enquanto escrevia este livro, as Tarefas do Maven para Ant estavam na versão 2.0.8. Ao clicar no link Maven Tasks for Ant 2.0.8 e escolher uma cópia, você fará o download do arquivo JAR nomeado maven-ant-tasks2.0.8.jar. Salve esse arquivo em um diretório local. Instalar as Tarefas do Maven para Ant Agora, copie o arquivo maven-ant-tasks-2.0.8.jar que você baixou em seu diretório ANT_HOME/lib. Se você está seguindo este capítulo do início ao fim, você acabou de baixar e instalar o Ant. Você também deve ter configurado a variável do ambiente ANT_HOME e deve estar familiarizado com o lugar em que instalou o Ant. Depois que copiou maven-ant-tasks-2.0.8.jar para o seu diretório ANT_HOME/lib, qualquer arquivo build.xml pode incluir espaço com nome apropriado para utilizar as Tarefas do Maven para Ant. Se executar esses exemplos em uma máquina de desenvolvimento multiusuário e não tiver direitos administrativos para colocar um arquivo JAR no diretório ANT_HOME/lib, não se preocupe. Você pode colocar o arquivo maven-ant-tasks-2.0.8.jar no diretório ~/.ant/lib. O Ant automaticamente procurará arquivos JAR nesse diretório. Depois de copiar maven-ant-tasks-2.0.8.jar em seu diretório ANT_HOME/lib, você poderá executar os seguintes comandos para ver se maven-ant-tasks-2.0.8.jar está incluído no caminho da classe em Unix: % ant -diagnostics | grep maven | grep bytes maven-ant-tasks-2.0.8.jar (960232 bytes) No Windows, execute ant-diagnostics e analise o resultado para verificar a presença de maven-ant-tasks2.0.8.jar na lista de bibliotecas, no caminho da classe. Utilizar o servidor de Banco de Dados HSQLDB O Hibernate funciona com grandes e variados bancos de dados relacionais; as chances são de que ele funcione com aquele que você está planejando usar em seu próximo projeto. Precisamos escolher um para focar em nossos exemplos e, por sorte, há uma opção óbvia. O projeto livre, de fonte aberta, 100% Java HSQLDB é poderoso o bastante para formar armazenamento complementar para os nossos projetos de software comercial. Surpreendentemente, também é independente e de simples instalação – tão fácil, na realidade, que podemos deixar o Maven cuidar dele para nós nesta nova versão do livro – por isso é perfeito discuti-lo aqui. (Se você já ouviu sobre o Hypersonic-SQL, essa é a encarnação atual dele. Grande parte da documentação do Hibernate utiliza nomes antigos. Não entre em pânico se você se deparou com o http://hsql.sourceforge.net/, pois parece o tipo de projeto que nunca foi terminado. Esse endereço está errado; ele fala sobre o predecessor ao projeto atual HSQLDB. A figura 1-2 mostra a página principal correta, atual e bem viva do projeto. #http://maven.apache.org/ Capítulo 1: Instalação e Configuração 7 Por que me preocupar? Os exemplos são fundamentados em um banco de dados que todos podem baixar e experimentar facilmente de maneira que não será necessário traduzir qualquer um dos nossos dialetos SQL ou comandos de sistema operacional para trabalhar com seus bancos de dados disponíveis (e que pode significar ainda que você economizará um dia ou dois para aprender como baixar, instalar e configurar um dos ambientes de banco de dados mais típicos. Finalmente, se o HSQLDB é novo para você, provavelmente ficará impressionado e intrigado e poderá até utilizá-lo em seus próprios projetos. Conforme está na página principal do projeto: O HSQLDB é o servidor líder de banco de dados relacional escrito em Java. Ele possui um driver JDBC e suporta um subsistema rico de ANSI-92 SQL (BNF em formato de árvore) mais as melhorias do SQL 99 e 2003. Ele oferece um pequeno (menos de 100 k em uma versão para miniaplicativos) e rápido servidor de banco de dados que oferece tanto memória interna como tabelas baseadas em disco e suporta modos embutidos e servidores. Ele também inclui ferramentas tais como um servidor mínimo para web, requisição em memória, ferramentas de gerenciamento (podem ser executadas como miniaplicativos) e um número de exemplos de demonstração. Como eu faço isso? Quando você construir os exemplos deste livro, as Tarefas Ant Maven automaticamente baixarão o HSQLDB JARs (e quaisquer outros JARs que forem necessários) do repositório Maven em http://repo1.maven.org/ maven2/. Por isso, se quiser começar a usar imediatamente, você pode pular para a seção “Configurando a Hierarquia de um Projeto”. Por outro lado, se preferir baixar o HSQLDB para suas próprias finalidades ou explorar a documentação, o fórum online ou os arquivos da lista de correspondência, visite a página do projeto em http://hsqldb.org/. Clique no link para baixar manualmente a “última versão estável” (que é a 1.8.0.7 usada quando o livro estava sendo escrito, conforme destacado na Figura 1-2). Ela te levará a uma página de downloads SourceForge com a versão atual selecionada. Faça uma cópia e baixe o arquivo ZIP. Continue, baixe o HSQLDB. Nossa, leva dois minutos, eles são pequenos! Mas e... ... algum outro banco de dados? Não se preocupe, o Hibernate pode trabalhar com MySQL, PostgreSQL, Oracle, DB2, Sybase, Informix, Apache Derby e outros. (Falaremos sobre como especificar “dialetos” em diferentes bancos de dados mais tarde, no Capítulo 10 e no Apêndice C.) E, se quiser realmente, você pode tentar compreender como trabalhar com o seu preferido desde o início, mas isso significa trabalho extra para você ao acompanhar os exemplos e perderá uma grande oportunidade para descobrir o HSQLDB. 8 Dominando Hibernate Figura 1-2 Link da última versão estável na página principal do HSQLDB Usar o Hibernate Core Esta seção não necessita de tanta motivação! Você pegou este livro porque quis aprender a usar o Hibernate. A parte que fornece serviços do núcleo do mapeamento objeto/relacional para suas aplicações é chamada, talvez não surpreendentemente, de Hibernate Core. Quando construir os exemplos deste livro, o Hibernate e todas as suas dependências são baixadas automaticamente. Apesar de esta nova versão dos exemplos do livro se preocupar em buscar o Hibernate através das Tarefas Ant Maven, você pode baixar a última distribuição do Hibernate para explorar a fonte ou apenas visualizar a documentação online, o fórum e outros materiais de apoio por sua conta. Se estiver pronto para os testes, você pode pular para a próxima seção, “Configurando a Hierarquia de um Projeto”. Como eu faço isso? Comece na página principal do Hibernate em http://hibernate.org/ e explore a partir dali. Para conseguir uma cópia completa da distribuição, procure o link de Download, que fica no lado esquerdo conforme mostrado na Figura 1-3. A seção das Versões Binárias mostrará qual versão do Hibernate Core é recomendável para ser baixada; siga essa recomendação. (Se tiver coragem, você pode tentar uma versão em Desenvolvimento, mas a aposta mais segura é ficar com a versão mais recente de Produção.) Depois que escolheu a versão, clique no link para Download na linha correspondente (veja a Figura 1-4). Capítulo 1: Instalação e Configuração 9 Figura 1-3 Link para Download na página principal do Hibernate Você será levado para uma página de downloads SourceForge com a sua versão escolhida e a opção de formatos de arquivos. Escolha a sua versão preferida e baixe-a. O nome do arquivo será algo do tipo hibernate-3. x.y.tar.gz ou hibernate-3.x.y.zip. (Enquanto escrevia este livro , os nomes dos arquivos começavam com hibernate-3.2.5.ga, uma vez que geralmente a versão disponível do Hibernate 3.2.5 é a versão de produção atual.) Escolha um local adequado para manter tais itens e expanda os arquivos compactados. Na página de download do Hibernate, você pode olhar o Hibernate Tools (link de download que leva até uma página entitulada JBossTools, mas ainda é possível encontrar o Hibernate Tools ali). Essas ferramentas oferecem diversas capacidades úteis que não são necessárias em uma aplicação que executa o Hibernate, mas são muito úteis para os desenvolvedores que criam tais aplicações. Logo utilizaremos uma para gerar código em Java em nossa primeira experiência. O nome de arquivo Tools aparecerá como em hibernatetools3.x.y.zip (não haverá necessariamente a mesma versão do próprio Hibernate, pois normalmente está disponível apenas como beta; a Matriz de Compatibilidade, logo abaixo da seção Versões Binárias da página de download do Hibernate, exibe uma tabela mostrando quais partes do Hibernate são compatíveis). 10 Dominando Hibernate Figura 1-4 Versões binárias do Hibernate Novamente, baixe esse arquivo e expanda-o perto de onde você colocou o Hibernate. Se tiver problemas com os links de download, o site pode ser alterado e você não verá os arquivos que espera. Se isso acontecer, você pode voltar e clicar no link “Browse all Hibernate downloads” abaixo da caixa das Versões Binárias e rolar a página até encontrar o que procura. O projeto é tão ativo que isso acontece com mais freqüência do que você imagina. Configurar a Hierarquia de um Projeto Embora comecemos com pequenos arquivos nesse teste, quando começarmos a projetar estruturas de dados e construir classes de Java e tabelas de banco de dados que as representam, junto com toda a configuração e arquivos de controle para uni-los e fazer coisas úteis acontecer, terminaremos com muitos arquivos. Por isso, queremos certificar que seremos muito organizados desde o início. Entre as ferramentas que baixamos e suas bibliotecas de suporte, há ainda um número significante de arquivos para organizar. Por sorte, as Tarefas Ant Maven baixam e gerenciam todas as dependências externas. Por que me preocupar? Se você construir algo legal estendendo os exemplos deste livro e quiser transformá-lo em uma aplicação real, estará bem desde o início. Além disso, se você configurar conforme está explicado aqui, os comandos e as instruções que dermos através dos exemplos farão sentido e funcionarão de fato; muitos exemplos constroem-se uns nos outros por todo o livro, por isso é importante continuar no caminho certo desde o início. Se quiser pular para os exemplos mais à frente ou evitar a digitação de códigos de amostra mais longos e arquivos de configuração, você pode baixar as versões “terminadas” dos exemplos do capítulo no site* do livro. Esses downloads serão organizados conforme for descrito aqui. Recomendamos que baixe os exemplos e os use como referência enquanto ler este livro. *http://www.altabooks.com.br Capítulo 1: Instalação e Configuração 11 Como eu faço isso? Aqui está a ordem de configuração da hierarquia de um projeto vazio, se você não estiver baixando os exemplos “terminados”: 1. Escolha um local em seu disco rígido, onde queira trabalhar com esses exemplos, e crie uma nova pasta, que será referida a partir de agora como o seu diretório de projeto. 2. Vá nesse diretório e crie subdiretórios chamados src e data. A hierarquia de fonte Java e os recursos relacionados estarão no diretório src. Nosso processo de construção fará a compilação em um diretório de classes que ele criar, assim como copiará qualquer recurso do tempo de execução ali. O diretório data é onde colocaremos o banco de dados HSQLDB. 3. As classes de exemplo que criaremos ficarão todas no pacote com.oreilly.hh (harnessing Hibernate) e faremos com que o Hibernate gere nossos beans de dados no pacote com.oreilly.hh.data para mantê-los separados das classes que escrevermos à mão, por isso crie esses diretórios abaixo do diretório src. No Linux e no Mac OS X, você pode usar: mkdir -p src/com/oreilly/hh/data de dentro do seu diretório de projeto para realizá-lo em um passo. Nesta altura, seu diretório de projeto deve estar estruturado como na Figura 1-5. Está bem mais simples que no primeiro livro, onde quase não compensa mostrar o exemplo. Um teste rápido Antes de ativar o Hibernate de fato para fazer qualquer trabalho útil, vale a pena verificar se as partes de apoio estão no devido lugar e prontas para serem utilizadas. Vamos começar pelo arquivo de configuração Ant que usaremos em todo o projeto, diga ao Ant onde foram colocados os arquivos que estamos usando e ative a interface de banco de dados gráfica HSQLDB. Isso será prova de que as Tarefas Ant Maven são capazes de encontrar e baixar as bibliotecas das quais os exemplos dependerão e a habilidade de acessar a interface será útil mais tarde, quando quisermos olhar os dados reais que o Hibernate vem criando para nós. No momento é, em primeiro lugar, um teste de racionalidade para verificar se não há erros e que estamos prontos para seguir adiante. Ative um editor de texto de sua escolha e crie um arquivo nomeado build.xml no nível superior, dentro do seu diretório de projeto. Digite o conteúdo do Exemplo 1-1 no arquivo. 12 Dominando Hibernate Figura 1-5 Conteúdo do diretório de projeto inicial O Hibernate está fazendo as criações para nós. Por enquanto, esta é apenas uma verificação de sanidade, para ver se não há nenhum defeito, e logo estaremos prontos para continuar. Abra o editor de texto de sua preferência e crie um arquivo chamado build.xml no topo de seu diretório de projetos. Digite o conteúdo do Exemplo 1-1 no arquivo. Exemplo 1-1. Arquivo de construção Ant <?xml version=”1.0”?> 1 <project name=”Harnessing Hibernate 3 (Developer’s Notebook Second Edition)” default=”db” basedir=”.” xmlns:artifact=”antlib:org.apache.maven.artifact.ant”> 2 <!-- Configure as propriedades que contêm diretórios de projeto importantes 3 --> <property name=”source.root” value=”src”/> <property name=”class.root” value=”classes”/> <property name=”data.dir” value=”data”/> <artifact:dependencies pathId=”dependency.classpath”> 4 <dependency groupId=”hsqldb” artifactId=”hsqldb” version=”1.8.0.7”/> <dependency groupId=”org.hibernate” artifactId=”hibernate” version=”3.2.5.ga”> <exclusion groupId=”javax.transaction” artifactId=”jta”/> </dependency> <dependency groupId=”org.hibernate” artifactId=”hibernate-tools” version=”3.2.0.beta9a”/> <dependency groupId=”org.apache.geronimo.specs” artifactId=”geronimo-jta_1.1_spec” version=”1.1”/> <dependency groupId=”log4j” artifactId=”log4j” version=”1.2.14”/> </artifact:dependencies> <!-- Configure o caminho de classe para compilação e execução --> <path id=”project.class.path”> 5 <!-- Inclua nossas próprias classes, é claro --> <pathelement location=”${class.root}” /> 6 <!-- Acrescente o classpath das dependências --> <path refid=”dependency.classpath”/> 7 </path> <target name=”db” description=”Runs HSQLDB database management UI against the database file--use when application is not running”> 8 <java classname=”org.hsqldb.util.DatabaseManager” fork=”yes”> <classpath refid=”project.class.path”/> <arg value=”-driver”/> <arg value=”org.hsqldb.jdbcDriver”/> Capítulo 1: Instalação e Configuração 13 <arg <arg <arg <arg </java> </target> </project> value=”-url”/> value=”jdbc:hsqldb:${data.dir}/music”/> value=”-user”/> value=”sa”/> Cuidado com a pontuação ao digitar isso e preste atenção especial nas tags XML de autofechamento (aquelas que terminam com “/>” em vez de “>”). Se errar, será retribuído com erros de sintaxe quando executar Ant. Novamente, você pode baixar todos esses arquivos se não precisar digitá-los. Se estiver como um arquivo em PDF na tela, você também pode copiar e colar o código, mas precisará editar os marcadores numerados em destaque. Se você nunca viu um arquivo de construção Ant antes, temos uma introdução rápida para ajudar você a orientar-se. Se quiser mais detalhes, a documentação em http://ant.apache.org/manual/index.html é muito boa: 1 A primeira linha é simplesmente uma declaração que o tipo do arquivo é XML. Se você já trabalhou com XML em outros contextos, está acostumado a ver isso. Se não, você o verá novamente. (Ant não necessita disso atualmente, mas a maioria das sintaxes XML necessita, então é bom desenvolver esse hábito.) 2 Os arquivos de construção do Ant contêm uma definição project única. O atributo default diz para Ant qual alvo (definido mais tarde) construir, se você não especificar um comando de linha. E o atributo basedir determina o diretório relativo para o qual todos os cálculos de caminho são feitos. Poderíamos ter deixado isso de fora já que o padrão é tratar os caminhos como sendo relativos ao diretório no qual o build.xml está localizado, mas não é uma boa prática ser explícito sobre configurações fundamentais como essa. Algo importante a se notar neste elemento project é a definição do espaço de nome xmlns:artifact para as Tarefas Ant Maven. Essa definição do espaço de nome torna as Tarefas Ant Maven disponíveis dentro desse arquivo de construção usando o prefixo artifact: (como você verá em uso posteriormente). 3 A próxima parte define três propriedades que podem ser usadas com nome pelo restante do arquivo em construção. Essencialmente, estamos definindo nomes simbólicos para os diretórios importantes usados por aspectos diferentes do projeto. Não é necessário (especialmente quando os diretórios são nomeados de maneira simples), porém essa é outra boa prática. Primeiramente, isso significa que, se você precisar mudar a localização de um desses diretórios, será necessário consertar apenas um lugar no arquivo em construção em vez de conduzir uma busca tediosa e fazer a substituição. 4 O elemento artifact:dependencies faz parte das Tarefas Ant Maven, que você (e Ant) podem chamar pelo prefixo artifact:Nesse elemento definimos uma série de dependências que o projeto necessita para compilação e execução. Essas dependências correspondem aos arquivos JAR (ou artefatos) no Repositório central do Maven 2 em http://repo1.maven.org/maven2. Cada artefato é unicamente identificado por um groupId, artifactId e um número version. Nesse projeto, dependemos do Hibernate, do HSQLDB, do Log4J e do JTA API. Quando as Tarefas Ant Maven encontram essas declarações de dependência, cada artefato é baixado do repositório central do Maven 2, em uma base de acordo com a necessidade, em seu repositório local do Maven 2 (in ~/.m2/repository). Não se preocupe se esta seção não fizer muito sentido ainda; entraremos em detalhes nas próximas páginas. 14 Dominando Hibernate Esta seção é onde você faria mudanças para usar a versão mais recente de um desses pacotes, se quisesse (uma vez que as versões mais recentes provavelmente estarão disponíveis após a publicação deste livro), mudando os valores de version. Mas você pode ficar tranqüilo porque os exemplos publicados no livro continuarão a funcionar, visto que o repositório do Maven garante que as versões que testamos em oposição continuarão disponíveis sempre que explorar os exemplos. Esse foi um grande motivo para decidirmos adotar as Tarefas Ant Maven neste livro. 5 A seção class-path serve uma finalidade clara. Esse atributo sozinho é o motivo de eu quase nunca começar os projetos em Java sem configurar, ao menos, uma construção Ant simples para eles. Quando se usa muitas bibliotecas de terceiros, o que você fará em qualquer projeto sério, há muito que precisa ir para o seu caminho de classe e você tem que ter certeza que configurou de maneira equivalente no tempo de compilação e execução. O Ant facilita isso. Definimos um caminho, que é como se fosse uma propriedade, mas ele sabe como analisar e selecionar arquivos e diretórios. Nosso caminho contém o diretório classes no qual estaremos compilando nosso código Java (esse diretório não existe ainda; acrescentaremos um passo no processo de construção para criá-lo no próximo capítulo), e também contém todos os arquivos JAR correspondentes às dependências listadas no elemento artifact:dependencies. É exatamente disso que precisamos para compilação e execução. A compreensão e a manipulação de Ant nos caminhos de Java e as hierarquias de classe é uma grande vantagem. Vale a pena aprender mais a fundo. 6 A sintaxe nessa linha parece uma complicação de pontuações, mas pode ser separada em partes que fazem sentido. O Ant permite usar a substituição para inserir valores variáveis em suas regras. Sempre que você vir algo do tipo “ ”, isso significa “procure o valor da propriedade nomeada class.root e coloque-o aqui.” Por isso, dada a definição da propriedade class.root antes, é como se digitassemos: <pathelementlocation=”clas ses”/>. Então, por que fazer isso? Isso permite que você divida um valor por todo o arquivo, assim, se precisar mudá-lo alguma vez, há apenas um lugar para se preocupar. De maneira mais ampla, em projetos complexos, esse tipo de organização e gerenciamento é crucial. 7 O elemento artifact:dependencies, que vimos antes, junta-se a todas as dependências declaradas em um único caminho nomeado dependency.classpath usando seu atributo pathId. Aqui, estamos anexando o conteúdo de dependency.classpath para o project.class.path para que todas as dependências trazidas pelo Maven estejam disponíveis na compilação e no tempo de execução. 8 Finalmente, com todo esse prólogo que não é demais, podemos definir nosso primeiro alvo. Um alvo é simplesmente uma série de tarefas que necessita ser executada com a finalidade de cumprir o objetivo de um projeto. Alvos típicos fazem coisas como compilar código, executar testes, empacotar coisas para distribuição e assim por diante. As tarefas são escolhidas a partir de uma série rica de capacidades construídas no Ant e ferramentas de terceiros, como o Hibernate, podem estender o Ant para fornecer suas próprias tarefas úteis, como veremos no próximo capítulo. Nosso primeiro alvo, db, executará a interface gráfica do HSQLDB para que possamos olhar em nosso banco de dados de exemplo. Podemos alcançar isso usando a tarefa java construída de Ant, que pode executar uma máquina virtual Java para nós, com quaisquer classe inicial, argumentos e propriedades que queiramos. Capítulo 1: Instalação e Configuração 15 Nesse caso, a classe que queremos invocar é org.hsqldb.util.DatabaseManager, localizada em HSQLDB JAR que as Tarefas Ant Maven gerenciarão para nós. Ao configurar o atributo fork para yes, você diz ao Ant para usar uma máquina virtual separada, que não é o padrão, uma vez que leva um pouco mais de tempo e normalmente não é necessária. Nesse caso é importante, desde que queiramos que o gerenciador de banco de dados GUI fique por perto até o dispensarmos, e isso não acontece quando é executado o VM próprio do Ant. Se seu banco de dados GUI abre e desaparece, verifique novamente o atributo fork da sua tarefa java. Você pode ver como informamos a tarefa java no caminho da classe que configuramos; essa é uma característica comum de nossos alvos. Em seguida, fornecemos uma quantidade de argumentos ao gerenciador do banco de dados dizendo para usar o driver HSQLDB JDBC, onde encontrar o banco de dados e que nome de usuário utilizar. Especificamos um banco de dados chamado music no diretório data. Atualmente, esse diretório está vazio, por isso o HSQLDB criará o banco de dados na primeira vez que o utilizarmos. O usuário é o “administrador do sistema” padrão para novos bancos de dados e ele é configurado para não precisar de senha inicialmente. É óbvio que, se você planeja disponibilizar esse banco de dados na rede (o que o HSQLDB é capaz de fazer), você terá que configurar uma senha. Não estamos fazendo nada tão especial, então podemos deixar isso de fora por enquanto. Certo, agora vamos tentar! Salve o arquivo e, a partir de uma orientação (comando) encapsulada executando em seu diretório de projeto de nível superior (onde você coloca build.xml), digite o comando: ant db (Ou, depois que fizemos do db o alvo padrão , é possível digitar apenas ant.) Uma vez que o Ant começa a ser executado, se tudo correr bem, você verá o produto assim: Buildfile: build.xml Downloading: hsqldb/hsqldb/1.8.0.7/hsqldb-1.8.0.7.pom Transferring 0K Downloading: org/hibernate/hibernate/3.2.5.ga/hibernate-3.2.5.ga.pom Transferring 3K Downloading: net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.pom Transferring 19K Downloading: commons-logging/commons-logging/1.0.4/commons-logging1.0.4.pom Transferring 5K Downloading: commons-collections/commons-collections/2.1/commons-collections2.1 .pom Transferring 3K Downloading: asm/asm-attrs/1.5.3/asm-attrs-1.5.3.pom Transferring 0K Downloading: dom4j/dom4j/1.6.1/dom4j-1.6.1.pom Transferring 6K Downloading: antlr/antlr/2.7.6/antlr-2.7.6.pom Transferring 0K Downloading: cglib/cglib/2.1_3/cglib-2.1_3.pom Transferring 0K Downloading: asm/asm/1.5.3/asm-1.5.3.pom Transferring 0K Downloading: commons-collections/commons-collections/2.1.1/commonscollections-2 .1.1.pom Transferring 0K 16 Dominando Hibernate Downloading: org/hibernate/hibernate-tools/3.2.0.beta9a/hibernate-tools3.2.0.be ta9a.pom Transferring 1K Downloading: org/hibernate/hibernate/3.2.0.cr5/hibernate-3.2.0.cr5.pom Transferring 3K Downloading: freemarker/freemarker/2.3.4/freemarker-2.3.4.pom Transferring 0K Downloading: org/hibernate/jtidy/r8-20060801/jtidy-r8-20060801.pom Transferring 0K Downloading: org/apache/geronimo/specs/geronimo-jta_1.1_spec/1.1/geronimojta_1. 1_spec-1.1.pom Transferring 1K Downloading: org/apache/geronimo/specs/specs/1.2/specs-1.2.pom Transferring 2K Downloading: org/apache/geronimo/genesis/config/project-config/1.1/projectconfi g-1.1.pom Transferring 14K Downloading: org/apache/geronimo/genesis/config/config/1.1/config-1.1.pom Downloading: org/apache/geronimo/genesis/config/config/1.1/config-1.1.pom Downloading: org/apache/geronimo/genesis/config/config/1.1/config-1.1.pom Transferring 0K Downloading: org/apache/geronimo/genesis/genesis/1.1/genesis-1.1.pom Downloading: org/apache/geronimo/genesis/genesis/1.1/genesis-1.1.pom Downloading: org/apache/geronimo/genesis/genesis/1.1/genesis-1.1.pom Transferring 6K Downloading: org/apache/apache/3/apache-3.pom Downloading: org/apache/apache/3/apache-3.pom Downloading: org/apache/apache/3/apache-3.pom Transferring 3K Downloading: log4j/log4j/1.2.14/log4j-1.2.14.pom Transferring 2K Downloading: org/hibernate/hibernate-tools/3.2.0.beta9a/hibernate-tools3.2.0.be ta9a.jar Transferring 352K Downloading: org/hibernate/jtidy/r8-20060801/jtidy-r8-20060801.jar Transferring 243K Downloading: commons-collections/commons-collections/2.1.1/commonscollections-2 .1.1.jar Transferring 171K Downloading: commons-logging/commons-logging/1.0.4/commons-logging1.0.4.jar Transferring 37K Downloading: antlr/antlr/2.7.6/antlr-2.7.6.jar Transferring 433K Downloading: org/apache/geronimo/specs/geronimo-jta_1.1_spec/1.1/geronimojta_1. 1_spec-1.1.jar Transferring 15K Downloading: net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.jar Transferring 203K Downloading: asm/asm/1.5.3/asm-1.5.3.jar Transferring 25K Downloading: freemarker/freemarker/2.3.4/freemarker-2.3.4.jar Transferring 770K Downloading: dom4j/dom4j/1.6.1/dom4j-1.6.1.jar Transferring 306K Downloading: asm/asm-attrs/1.5.3/asm-attrs-1.5.3.jar Transferring 16K Downloading: cglib/cglib/2.1_3/cglib-2.1_3.jar Transferring 275K Downloading: hsqldb/hsqldb/1.8.0.7/hsqldb-1.8.0.7.jar Transferring 628K Downloading: log4j/log4j/1.2.14/log4j-1.2.14.jar Capítulo 1: Instalação e Configuração 17 Transferring 358K Downloading: org/hibernate/hibernate/3.2.5.ga/hibernate-3.2.5.ga.jar Transferring 2202K db: Essa grande lista de downloads mostra as Tarefas Ant Maven realizando o seu trabalho de procurar as partes que dissemos que precisaríamos (incluindo o HSQLDB e o Hibernate), juntamente com todas as bibliotecas que elas, por sua vez, dependem. Isso leva um tempo para fazer (dependendo da velocidade da sua conexão de rede, e de quanto os servidores estejam carregados), mas isso será necessário apenas uma vez. Na próxima vez que você ativar o Ant, as Tarefas Ant Maven simplesmente avisarão que seu repositório local já contém todas essas partes, e prosseguirá silenciosamente com o que você quiser executar. Depois que todo o download estiver completo, o Ant mostra db: para indicar que começa executar o alvo requisitado. Um tempo depois, você deve ver a interface gráfica do HSQLDB, que será como na Figura 1-6. Não há nada em nosso banco de dados ainda, por isso há muito coisa a ser vista, caso o comando tenha funcionado. A exibição em árvore na parte superior esquerda é onde as diversas tabelas e colunas em nosso banco de dados podem ser exploradas. Por enquanto, verifique apenas se a parte superior lê jdbc:hsqldb:data/music. Figura 1-6 Interface do gerenciador de banco de dados HSQLDB Você pode explorar os menus um pouco se quiser, mas não mude nada no banco de dados. Quando terminar, escolha File Exit. A janela fechará e o Ant notificará: BUILD SUCCESSFUL Total time: 56 seconds A quantidade de tempo que você gastará brincando pode variar, é claro. (Lembre que o Ant fica por perto até que o banco de dados fecha, devido ao atributo fork que acrescentamos à tarefa java.) Nesse ponto, se você olhar no diretório de dados, vai achar que o HSQLDB criou alguns arquivos para manter o banco de dados: % ls data music.log 18 Dominando Hibernate music.properties music.script Você pode até olhar o conteúdo desses arquivos. Diferente da maioria dos sistemas de banco de dados, o HSQLDB armazena seus dados em um formato legível por padrão. O arquivo das propriedades contém algumas configurações básicas e os dados por si só entram no arquivo do script, na forma de declaração SQL. O arquivo de evento é utilizado para reconstruir o estado de um banco de dados consistente se a aplicação travar, do contrário sai sem fechar o banco de dados com elegância. Nesse momento, tudo o que você encontrará nesses arquivos são as definições básicas que entram por padrão, mas como começamos a criar tabelas e a adicionar dados a elas, você poderá visualizar o arquivo novamente e ver as mudanças aparecerem nela. Essa pode ser uma característica de depuração para verificação de sanidade e é ainda mais rápido que ativar a interface gráfica e as queries em execução. O fato de poder ler os arquivos do banco de dados HSQLDB é estranho, mas divertido. O que aconteceu? Agora que executamos o primeiro exemplo com sucesso e configuramos nosso arquivo de construção de projeto, provavelmente é o tempo de explicar como o Ant recuperou todas as dependências necessárias para esse projeto. Vamos examinar novamente o elemento artifact:dependencies do arquivo build.xml de exemplo. (veja o Exemplo 1-2). Exemplo 1-2 Nosso elemento artifact:dependencies <artifact:dependencies pathId=”dependency.classpath”> <dependency groupId=”hsqldb” artifactId=”hsqldb” version=”1.8.0.7”/> <dependency groupId=”org.hibernate” artifactId=”hibernate” version=”3.2.5.ga”> <exclusion groupId=”javax.transaction” artifactId=”jta”/> </dependency> <dependency groupId=”org.hibernate” artifactId=”hibernate-tools” version=”3.2.0.beta9a”/> <dependency groupId=”org.apache.geronimo.specs” artifactId=”geronimo-jta_1.1_spec” version=”1.1”/> <dependency groupId=”log4j” artifactId=”log4j” version=”1.2.14”/> </artifact:dependencies> Se você nunca usou o Maven antes, isso pode parecer muito confuso. Vamos começar definindo a terminologia. Primeiro há um artefato. Um artefato é um arquivo produzido por um projeto. Um artefato pode ser de qualquer tipo – um WAR para uma aplicação web, um EAR para a aplicação de um projeto ou um JAR. Para o nosso objetivo dependemos de artefatos JAR e o tipo padrão se não especificado no elemento de dependência é jar, convenientemente suficiente. Um artefato específico é identificado por quatro atributos: groupId, artifactId, version e type. Por exemplo, dependemos da versão 3.2.5.ga do artefato hibernate no grupo org.hibernate e o tipo indicado é jar. O Maven utilizará esses identificadores para localizar a dependência apropriada no repósitório central do Maven 2 que está hospedado em http://repo1.maven.org/maven2/. Usando esses valores, o Maven tentará localizar o JAR para o hibernate usando o seguinte padrão: <repositoryUrl>/<groupId>/<artifactId>/<v ersion>/<artifactId>-<version>.<type>, onde os períodos no groupId são convertidos para separadores de caminho para as URLs, usando esse padrão, seria útil colocar os JARs nas dependências do Hibernate e do HSQLDB. Veja o Exemplo 1-3. Example 1-3. URLs para as dependências de projeto. http://repo1.maven.org/org/hibernate/hibernate/3.2.5.ga/hibernate-3.2.5.ga.jar http://repo1.maven.org/hsqldb/hsqldb/1.8.0.7/hsqldb-1.8.0.7.jar Capítulo 1: Instalação e Configuração 19 No nosso arquivo build.xml, estamos excluindo a dependência JTA da declaração de dependência do Hibernate. Isso é necessário porque a biblioteca do Hibernate depende de um artefato JAR não livre e não disponível no repositório público do Maven 2. Em vez de usar o padrão Sun fornecido pela JTA API JAR, esse projeto depende de uma versão do JTA API criada pelo projeto Apache Geronimo. geronimo-jta_1.1_spec é uma implementação livre de fonte aberta de Java Transaction API. Essa substituição é realizada usando o elemento exclusion dentro da dependência para o Hibernate 3.2.5.ga, combinada com a dependência explícita da especificação Geronimo JTA 1.1 mais à frente. Certo, então temos uma percepção de como as Tarefas Ant Maven recuperam as dependências do repositório do Maven, mas para onde elas vão uma vez que foram baixadas? As Tarefas Ant Maven baixam todas as dependências para um repositório local do Maven. O Maven mantém um repositório local com uma estrutura que espelha o repositório remoto. Quando necessita da verificação de um artefato, ele confere o repositório local primeiro, antes de exigir o artefato do repositório remoto. Isso significa que se vinte projetos referenciam a mesma versão do Hibernate, ele é baixado do repositório remoto uma vez, e todos os vinte projetos farão referência a uma única cópia armazenada no repositório local do Maven. Então, onde fica esse repositório local mágico do Maven? A maneira mais fácil de responder a essa perguntar é acrescentar um alvo para o nosso arquivo build.xml. Acrescente o alvo a seguir ao final do build.xml de Ant anterior do capítulo, conforme mostrado no Exemplo 1-4. Exemplo 1-4. Mostrando o caminho de classe da dependência <target name=”print-classpath” description=”Show the dependency class path”> <property name=”class.path” refid=”dependency.classpath”/> <echo>${class.path}</echo> </target> A execução desse alvo produzirá os seguintes resultados de saída: % ant print-classpath Buildfile: build.xml print-classpath: [echo] ~\.m2\repository\commons-logging\commons-logging\1.0.4\commonslogging1.0.4.jar;\ ~\.m2\repository\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;\ ~\.m2\repository\cglib\cglib\2.1_3\cglib-2.1_3.jar;\... Tente executar esse alvo. O resultado terá variações, dependendo de qual sistema operacional você está usando, mas você perceberá que o caminho de classe da dependência se refere ao seu repositório local do Maven. Em uma máquina com Windows XP isso acontecerá provavelmente em C:\Documents and Settings\Username\.m2\repository; no Windows Vista será em C:\Users\Username\.m2\repository e no Unix e Macintosh será no diretório ~/.m2/repository. Você também perceberá que existem mais dependências listadas no caminho de classe do que foi declarado no elemento artifact:dependencies em build.xml. Essas dependências extras são chamadas de dependências transitórias, e são dependências de suas dependências declaradas explicitamente. Por exemplo, o Hibernate depende do CGLib, EHCache e da Commons Collections, dentre outras coisas. Embora esteja fora do escopo deste livro, darei uma dica sobre como as Tarefas Ant Maven entendem as configurações completas das dependências para o seu projeto. Se explorar seu repositório local depois de ter construído um dos exemplos, você verá que perto de todo artefato JAR há um arquivo com a extensão .pom. Os arquivos Project Object Model files (or POMs) são a fundação do sistema de construção e repositório do Maven. Cada POM descreve um artefato e as dependências daquele artefato. As Tarefas Ant Maven usam esses metadados para construir uma árvore de dependências transitórias. Em outras palavras, as Tarefas Ant Maven não se preocupam apenas em baixar o Hibernate, elas baixam tudo o que o Hibernate depende. Tudo o que você precisa saber é que funciona. 20 Dominando Hibernate E agora? Graças às Tarefas Ant Maven, você teve menos dificuldades para encontrar, baixar, expandir e organizar o software do que os leitores da versão anterior deste livro. Você está no ponto ideal para começar a trabalhar com o Hibernate e, como você verá no próximo capítulo, passaremos muito rapidamente. Você poderá ver o código Java escrito para você! O esquema do banco de dados criados em lugar algum (ou, pelo menos, fora da mesma tabela de mapeamento XML que produziu Java)! As tabelas reais e os dados aparecendo na interface do gerenciador HSQLDB! (ou, pelo menos, dados de amostra falsos genuínos...) Parece interessante? Bem, comparado com o que fizemos até aqui? Então vamos começar com tudo para acordar o poder do Hibernate. Por que não funcionou? Se, por outro lado, você não viu a janela do gerenciador do banco de dados aparecer e, em vez disso, foi recebido com mensagens de erros, tente entender se foi devido a problemas no arquivo de construção, por diferenças na maneira que você configurou Ant ou sua hierarquia de projeto; dificuldade em acessar a Internet para baixar as dependências do repositório do Maven ou algo mais. Verifique mais de uma vez se todas as partes foram arrumadas e instaladas como vimos anteriormente, e considere baixar o código de amostra se estiver tendo problemas com uma versão que você mesmo digitou. Capítulo 1: Instalação e Configuração 21