Nosso primeiro objetivo permanecermos atualizados sobre o Hibernate o mais rpido possvel. A maioria dos captulos desta parte de verses atualizadas do contedo de Hibernate: A Developers Notebook (OReilly), que reflete as principais mudanas que acompanharam o Hibernate 3. A amostra de cdigo agora funciona com as verses mais atualizadas das ferramentas nas quais confiamos para fornecer um ambiente fcil, porm, realista para se trabalhar com o Hibernate. Tambm h um novo captulo falando sobre a capacidade de usar anotaes Java 5, ao invs de arquivos de mapeamento XML, para configurar os mapeamentos do Hibernate. Comear e seguir os exemplos ainda mais fcil nesta nova verso do livro, pois adotamos o Maven para ajudar a baixar muitas das ferramentas e bibliotecas. Como esperamos que voc perceba, no h desculpa para evitar mergulhar e experimentar tudo isso sozinho! Quando se sentir confortvel 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 so quando trabalham sozinhos. Muito bem, hora de mergulhar....
CAPTULO 1
Instalao e Congurao
Ainda me surpreende como h tantas ferramentas JavaTM grandes, livres e de fonte aberta disposio. Quando precisei de um servio de mapeamento objeto/relacional de peso leve para um projeto de e-commerce JSP na virada do milnio, tive de construir o meu prprio. Ele evoluiu com os anos, desenvolveu caractersticas excelentes e nicas e o temos usado em uma grande variedade de contextos diferentes. Mas, quando descobri o Hibernate, ns o utilizamos para um novo desenvolvimento em vez de us-lo para meu prprio sistema, j familiar (para felizmente admitir preconceitos). Isso revela o quanto ele irresistvel! 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 to complicado a ponto de tornar o aprendizado um desafio assombroso por si s. Para mostrar isso, este captulo leva voc at o ponto em que poder brincar com o Hibernate e ver porque ele to cativante. Os ltimos captulos mostraro como usar o Hibernate como parte de ambientes mais complexos tais como o Spring e o Stripes e tambm como us-lo com outros bancos de dados. O objetivo deste primeiro captulo mostrar como fcil reunir um ambiente bsico e independente em que possvel explorar o Hibernate e fazer coisas verdadeiras com ele.
fazer muito mais coisas excelentes com menos esforo - especialmente agora que vrias ferramentas do Hibernate tm suporte Ant explcito, 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 necessrio optar por um, no esprito 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 construo, voc perceber que estamos usando Tarefas Ant do Maven para gerenciar as dependncias de nossas construes Ant. Embora o Maven esteja ganhando fora, o Ant continua sendo a ferramenta para construo mais amplamente usada em desenvolvimento de Java. O cdigo de exemplo de cada captulo tambm possui um arquivo pom.xml do Maven e pode ser compilado com ele. Em muitos casos, o arquivo de construo do Maven fornece a mesma funcionalidade que o arquivo build.xml de Ant usando o plug-in Maven Hibernate 3. No captulo 12 voc encontrar orientaes para construir e distribuir aplicaes do Hibernate utilizando o Maven por completo, mas a maioria dos exemplos deste livro foca Ant como uma ferramenta de construo, utilizando as Tarefas Ant Maven para aliviar o tdio de ter que procurar e baixar as vrias bibliotecas que precisamos e as bibliotecas das quais elas, por sua vez, dependem. Para se beneficiar de todas essas capacidades, necessrio 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 construes de Java, e fico perdido sem ele.
Uma vez que o Ant foi estabelecido, voc precisa fazer algumas coisas para que ele funcione corretamente. necessrio acrescentar seu diretrio bin na distribuio (neste exemplo, / usr/local/ant/bin) para o seu caminho de comando. Tambm necessrio configurar a varivel do ambiente ANT_HOME para o diretrio de nvel 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.
geralmente era necessrio reconstruir o arquivo Hibernate JAR usando o seu compilador 1.3. Podemos apenas imaginar que verses mais recentes dependem ainda mais fortemente de verses atuais de Java e Java 5 j est de lado tempo o suficiente e tem seus prprios benefcios, que nem mesmo investigaremos a compatibilidade com JDKs anteriores. Nossos exemplos so escritos supondo que voc tenha ao menos o Java 5 caso no tenha, srios ajustes sero necessrios:
% 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 tambm deve usar uma distribuio Java licenciada verdadeira (como as da Sun ou Apple); nossos revisores tcnicos acharam que a semelhante implementao GNU no executaria essas ferramentas e exemplos adequadamente quando estvamos escrevendo este livro. Esse ambiente GNU o Java padro carregado com diversas distribuies Linux. Se estiver trabalhando com uma distribuio Linux, pode ser que precise baixar o JDK da Sun e ter certeza que essa a verso 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 padro, mesmo em distribuies puristas. At l, provavelmente ser necessrio fazer o donwload da verso mais recente. Quando este livro estava sendo escrito, as distribuies baseadas em Debian permitiam instalar um JDK Sun utilizando seus utilitrios de gerenciamento de pacotes (tanto o 5 como o 6 esto disponveis nas verses Feisty Fawn e Gustsy Gibbon do Ubuntu. Distribuies derivadas do Red Hat ainda necessitam baixar Java diretamente da Sun Microsystems. Sua quilometragem pode variar. Quando tudo isso estiver configurado, voc pode comear 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, no muito ainda, mas agora voc est em uma posio 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, no seria m idia ler o manual um pouquinho para ter noo 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 OReilly (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 construo. (Vrios j utilizam Ant, ento pode ser que voc inicie mais frente; para os outros, pode ser que passem por alguns momentos difceis.) Se tudo falhar, use o IDE para desenvolver seu prprio cdigo, mas chame o Ant da linha de comando quando precisar usar um de nossos scripts de construo.
http://www.ant.apache.org/manual/ http://www.eclipse.org/ http://www.borland.com/jbuilder/ http://www.netbeans.org/ Captulo 1: Instalao e Congurao 5
Se estiver usando o Maven, voc pode gerar os arquivos do projeto Eclipse IDE executando mvn eclipse:eclipse do diretrio de exemplo de qualquer captulo ou de diretrios de exemplo de nveis superiores. Se executar mvn eclipse:eclipse dos diretrios de exemplo, o Maven gerar um projeto Eclipse para cada configurao de exemplo do captulo. No Captulo 12 voc encontrar instrues mais detalhadas para construir os exemplos em Maven e, no Captulo 11, uma introduo para usar as ferramentas Eclipse do Hibernate mais profundamente.
Figura 1-1 Link do download para as Tarefas do Maven para Ant no site do Maven
Nesta verso declaramos as dependncias de nossos projetos em nosso arquivo build.xml e deixamos o Maven tomar conta do download e do gerenciamento de nossas dependncias. Isso economiza toneladas de passos e de tempo. Agora hora de instalar as Tarefas do Maven para Ant.
Ant porque ele requer uma quantidade mnima de trabalho no arquivo build.xml do nosso exemplo e facilita o compartilhamento de vrios projetos. Criaremos build.xml mais tarde. Primeiro vamos baixar o arquivo JAR necessrio do site# do Maven. Na primeira pgina 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 verso 2.0.8. Ao clicar no link Maven Tasks for Ant 2.0.8 e escolher uma cpia, voc far o download do arquivo JAR nomeado maven-ant-tasks2.0.8.jar. Salve esse arquivo em um diretrio local.
No Windows, execute ant-diagnostics e analise o resultado para verificar a presena de maven-ant-tasks2.0.8.jar na lista de bibliotecas, no caminho da classe.
Mas e...
... algum outro banco de dados? No 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 Captulo 10 e no Apndice C.) E, se quiser realmente, voc pode tentar compreender como trabalhar com o seu preferido desde o incio, mas isso significa trabalho extra para voc ao acompanhar os exemplos e perder uma grande oportunidade para descobrir o HSQLDB.
8 Dominando Hibernate
Voc ser levado para uma pgina de downloads SourceForge com a sua verso escolhida e a opo de formatos de arquivos. Escolha a sua verso 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 comeavam com hibernate-3.2.5.ga, uma vez que geralmente a verso disponvel do Hibernate 3.2.5 a verso de produo atual.) Escolha um local adequado para manter tais itens e expanda os arquivos compactados. Na pgina de download do Hibernate, voc pode olhar o Hibernate Tools (link de download que leva at uma pgina entitulada JBossTools, mas ainda possvel encontrar o Hibernate Tools ali). Essas ferramentas oferecem diversas capacidades teis que no so necessrias em uma aplicao que executa o Hibernate, mas so muito teis para os desenvolvedores que criam tais aplicaes. Logo utilizaremos uma para gerar cdigo em Java em nossa primeira experincia. O nome de arquivo Tools aparecer como em hibernatetools3.x.y.zip (no haver necessariamente a mesma verso do prprio Hibernate, pois normalmente est disponvel apenas como beta; a Matriz de Compatibilidade, logo abaixo da seo Verses Binrias da pgina de download do Hibernate, exibe uma tabela mostrando quais partes do Hibernate so compatveis).
10 Dominando 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 no ver os arquivos que espera. Se isso acontecer, voc pode voltar e clicar no link Browse all Hibernate downloads abaixo da caixa das Verses Binrias e rolar a pgina at encontrar o que procura. O projeto to ativo que isso acontece com mais freqncia do que voc imagina.
de dentro do seu diretrio de projeto para realiz-lo em um passo. Nesta altura, seu diretrio de projeto deve estar estruturado como na Figura 1-5. Est bem mais simples que no primeiro livro, onde quase no compensa mostrar o exemplo.
Um teste rpido
Antes de ativar o Hibernate de fato para fazer qualquer trabalho til, vale a pena verificar se as partes de apoio esto no devido lugar e prontas para serem utilizadas. Vamos comear pelo arquivo de configurao 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 grfica HSQLDB. Isso ser prova de que as Tarefas Ant Maven so capazes de encontrar e baixar as bibliotecas das quais os exemplos dependero e a habilidade de acessar a interface ser til mais tarde, quando quisermos olhar os dados reais que o Hibernate vem criando para ns. No momento , em primeiro lugar, um teste de racionalidade para verificar se no 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 nvel superior, dentro do seu diretrio de projeto. Digite o contedo do Exemplo 1-1 no arquivo.
12 Dominando Hibernate
O Hibernate est fazendo as criaes para ns. Por enquanto, esta apenas uma vericao de sanidade, para ver se no h nenhum defeito, e logo estaremos prontos para continuar. Abra o editor de texto de sua preferncia e crie um arquivo chamado build.xml no topo de seu diretrio de projetos. Digite o contedo do Exemplo 1-1 no arquivo.
Exemplo 1-1. Arquivo de construo Ant
<?xml version=1.0?> 1 <project name=Harnessing Hibernate 3 (Developers Notebook Second Edition) default=db basedir=. xmlns:artifact=antlib:org.apache.maven.artifact.ant> 2 <!-- Configure as propriedades que contm diretrios 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 compilao e execuo --> <path id=project.class.path> 5 <!-- Inclua nossas prprias classes, claro --> <pathelement location=${class.root} /> 6 <!-- Acrescente o classpath das dependncias --> <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/>
Cuidado com a pontuao ao digitar isso e preste ateno especial nas tags XML de autofechamento (aquelas que terminam com /> em vez de >). Se errar, ser retribudo com erros de sintaxe quando executar Ant. Novamente, voc pode baixar todos esses arquivos se no precisar digit-los. Se estiver como um arquivo em PDF na tela, voc tambm pode copiar e colar o cdigo, mas precisar editar os marcadores numerados em destaque. Se voc nunca viu um arquivo de construo Ant antes, temos uma introduo rpida para ajudar voc a orientar-se. Se quiser mais detalhes, a documentao em http://ant.apache.org/manual/index.html muito boa:
A primeira linha simplesmente uma declarao que o tipo do arquivo XML. Se voc j trabalhou com XML em outros contextos, est acostumado a ver isso. Se no, voc o ver novamente. (Ant no necessita disso atualmente, mas a maioria das sintaxes XML necessita, ento bom desenvolver esse hbito.) Os arquivos de construo do Ant contm uma definio project nica. O atributo default diz para Ant qual alvo (definido mais tarde) construir, se voc no especificar um comando de linha. E o atributo basedir determina o diretrio relativo para o qual todos os clculos de caminho so feitos. Poderamos ter deixado isso de fora j que o padro tratar os caminhos como sendo relativos ao diretrio no qual o build.xml est localizado, mas no uma boa prtica ser explcito sobre configuraes fundamentais como essa. Algo importante a se notar neste elemento project a definio do espao de nome xmlns:artifact para as Tarefas Ant Maven. Essa definio do espao de nome torna as Tarefas Ant Maven disponveis dentro desse arquivo de construo usando o prefixo artifact: (como voc ver em uso posteriormente). A prxima parte define trs propriedades que podem ser usadas com nome pelo restante do arquivo em construo. Essencialmente, estamos definindo nomes simblicos para os diretrios importantes usados por aspectos diferentes do projeto. No necessrio (especialmente quando os diretrios so nomeados de maneira simples), porm essa outra boa prtica. Primeiramente, isso significa que, se voc precisar mudar a localizao de um desses diretrios, ser necessrio consertar apenas um lugar no arquivo em construo em vez de conduzir uma busca tediosa e fazer a substituio. O elemento artifact:dependencies faz parte das Tarefas Ant Maven, que voc (e Ant) podem chamar pelo prefixo artifact:Nesse elemento definimos uma srie de dependncias que o projeto necessita para compilao e execuo. Essas dependncias correspondem aos arquivos JAR (ou artefatos) no Repositrio central do Maven 2 em http://repo1.maven.org/maven2. Cada artefato unicamente identificado por um groupId, artifactId e um nmero version. Nesse projeto, dependemos do Hibernate, do HSQLDB, do Log4J e do JTA API. Quando as Tarefas Ant Maven encontram essas declaraes de dependncia, cada artefato baixado do repositrio central do Maven 2, em uma base de acordo com a necessidade, em seu repositrio local do Maven 2 (in ~/.m2/repository). No se preocupe se esta seo no fizer muito sentido ainda; entraremos em detalhes nas prximas pginas.
14 Dominando Hibernate
Esta seo onde voc faria mudanas para usar a verso mais recente de um desses pacotes, se quisesse (uma vez que as verses mais recentes provavelmente estaro disponveis aps a publicao deste livro), mudando os valores de version. Mas voc pode ficar tranqilo porque os exemplos publicados no livro continuaro a funcionar, visto que o repositrio do Maven garante que as verses que testamos em oposio continuaro disponveis sempre que explorar os exemplos. Esse foi um grande motivo para decidirmos adotar as Tarefas Ant Maven neste livro.
5
A seo class-path serve uma finalidade clara. Esse atributo sozinho o motivo de eu quase nunca comear os projetos em Java sem configurar, ao menos, uma construo Ant simples para eles. Quando se usa muitas bibliotecas de terceiros, o que voc far em qualquer projeto srio, 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 compilao e execuo. O Ant facilita isso. Definimos um caminho, que como se fosse uma propriedade, mas ele sabe como analisar e selecionar arquivos e diretrios. Nosso caminho contm o diretrio classes no qual estaremos compilando nosso cdigo Java (esse diretrio no existe ainda; acrescentaremos um passo no processo de construo para cri-lo no prximo captulo), e tambm contm todos os arquivos JAR correspondentes s dependncias listadas no elemento artifact:dependencies. exatamente disso que precisamos para compilao e execuo. A compreenso e a manipulao de Ant nos caminhos de Java e as hierarquias de classe uma grande vantagem. Vale a pena aprender mais a fundo.
A sintaxe nessa linha parece uma complicao de pontuaes, mas pode ser separada em partes que fazem sentido. O Ant permite usar a substituio para inserir valores variveis 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 definio da propriedade class.root antes, como se digitassemos: <pathelementlocation=clas ses/>. Ento, 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 organizao e gerenciamento crucial.
O elemento artifact:dependencies, que vimos antes, junta-se a todas as dependncias declaradas em um nico caminho nomeado dependency.classpath usando seu atributo pathId. Aqui, estamos anexando o contedo de dependency.classpath para o project.class.path para que todas as dependncias trazidas pelo Maven estejam disponveis na compilao e no tempo de execuo.
Finalmente, com todo esse prlogo que no demais, podemos definir nosso primeiro alvo. Um alvo simplesmente uma srie de tarefas que necessita ser executada com a finalidade de cumprir o objetivo de um projeto. Alvos tpicos fazem coisas como compilar cdigo, executar testes, empacotar coisas para distribuio e assim por diante. As tarefas so escolhidas a partir de uma srie rica de capacidades construdas no Ant e ferramentas de terceiros, como o Hibernate, podem estender o Ant para fornecer suas prprias tarefas teis, como veremos no prximo captulo. Nosso primeiro alvo, db, executar a interface grfica do HSQLDB para que possamos olhar em nosso banco de dados de exemplo. Podemos alcanar isso usando a tarefa java construda de Ant, que pode executar uma mquina virtual Java para ns, com quaisquer classe inicial, argumentos e propriedades que queiramos.
Captulo 1: Instalao e Congurao 15
Nesse caso, a classe que queremos invocar org.hsqldb.util.DatabaseManager, localizada em HSQLDB JAR que as Tarefas Ant Maven gerenciaro para ns. Ao configurar o atributo fork para yes, voc diz ao Ant para usar uma mquina virtual separada, que no o padro, uma vez que leva um pouco mais de tempo e normalmente no necessria. Nesse caso importante, desde que queiramos que o gerenciador de banco de dados GUI fique por perto at o dispensarmos, e isso no acontece quando executado o VM prprio 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 caracterstica 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 usurio utilizar. Especificamos um banco de dados chamado music no diretrio data. Atualmente, esse diretrio est vazio, por isso o HSQLDB criar o banco de dados na primeira vez que o utilizarmos. O usurio o administrador do sistema padro para novos bancos de dados e ele configurado para no 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. No estamos fazendo nada to especial, ento podemos deixar isso de fora por enquanto. Certo, agora vamos tentar! Salve o arquivo e, a partir de uma orientao (comando) encapsulada executando em seu diretrio de projeto de nvel superior (onde voc coloca build.xml), digite o comando:
ant db
(Ou, depois que fizemos do db o alvo padro , possvel digitar apenas ant.) Uma vez que o Ant comea 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
Essa grande lista de downloads mostra as Tarefas Ant Maven realizando o seu trabalho de procurar as partes que dissemos que precisaramos (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 conexo de rede, e de quanto os servidores estejam carregados), mas isso ser necessrio apenas uma vez. Na prxima vez que voc ativar o Ant, as Tarefas Ant Maven simplesmente avisaro que seu repositrio local j contm 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 comea executar o alvo requisitado. Um tempo depois, voc deve ver a interface grfica do HSQLDB, que ser como na Figura 1-6. No h nada em nosso banco de dados ainda, por isso h muito coisa a ser vista, caso o comando tenha funcionado. A exibio 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.
Voc pode explorar os menus um pouco se quiser, mas no 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 diretrio de dados, vai achar que o HSQLDB criou alguns arquivos para manter o banco de dados:
% ls data music.log music.properties music.script
18 Dominando Hibernate
Voc pode at olhar o contedo desses arquivos. Diferente da maioria dos sistemas de banco de dados, o HSQLDB armazena seus dados em um formato legvel por padro. O arquivo das propriedades contm algumas configuraes bsicas e os dados por si s entram no arquivo do script, na forma de declarao SQL. O arquivo de evento utilizado para reconstruir o estado de um banco de dados consistente se a aplicao travar, do contrrio sai sem fechar o banco de dados com elegncia. Nesse momento, tudo o que voc encontrar nesses arquivos so as definies bsicas que entram por padro, mas como comeamos a criar tabelas e a adicionar dados a elas, voc poder visualizar o arquivo novamente e ver as mudanas aparecerem nela. Essa pode ser uma caracterstica de depurao para verificao de sanidade e ainda mais rpido que ativar a interface grfica e as queries em execuo. 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 construo de projeto, provavelmente o tempo de explicar como o Ant recuperou todas as dependncias necessrias 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 comear 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 aplicao web, um EAR para a aplicao de um projeto ou um JAR. Para o nosso objetivo dependemos de artefatos JAR e o tipo padro se no especificado no elemento de dependncia jar, convenientemente suficiente. Um artefato especfico identificado por quatro atributos: groupId, artifactId, version e type. Por exemplo, dependemos da verso 3.2.5.ga do artefato hibernate no grupo org.hibernate e o tipo indicado jar. O Maven utilizar esses identificadores para localizar a dependncia apropriada no repsitrio 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 padro: <repositoryUrl>/<groupId>/<artifactId>/<v ersion>/<artifactId>-<version>.<type>, onde os perodos no groupId so convertidos para separadores de caminho para as URLs, usando esse padro, seria til colocar os JARs nas dependncias do Hibernate e do HSQLDB. Veja o Exemplo 1-3.
Example 1-3. URLs para as dependncias 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
No nosso arquivo build.xml, estamos excluindo a dependncia JTA da declarao de dependncia do Hibernate. Isso necessrio porque a biblioteca do Hibernate depende de um artefato JAR no livre e no disponvel no repositrio pblico do Maven 2. Em vez de usar o padro Sun fornecido pela JTA API JAR, esse projeto depende de uma verso do JTA API criada pelo projeto Apache Geronimo. geronimo-jta_1.1_spec uma implementao livre de fonte aberta de Java Transaction API. Essa substituio realizada usando o elemento exclusion dentro da dependncia para o Hibernate 3.2.5.ga, combinada com a dependncia explcita da especificao Geronimo JTA 1.1 mais frente. Certo, ento temos uma percepo de como as Tarefas Ant Maven recuperam as dependncias do repositrio do Maven, mas para onde elas vo uma vez que foram baixadas? As Tarefas Ant Maven baixam todas as dependncias para um repositrio local do Maven. O Maven mantm um repositrio local com uma estrutura que espelha o repositrio remoto. Quando necessita da verificao de um artefato, ele confere o repositrio local primeiro, antes de exigir o artefato do repositrio remoto. Isso significa que se vinte projetos referenciam a mesma verso do Hibernate, ele baixado do repositrio remoto uma vez, e todos os vinte projetos faro referncia a uma nica cpia armazenada no repositrio local do Maven. Ento, onde fica esse repositrio local mgico do Maven? A maneira mais fcil 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 captulo, conforme mostrado no Exemplo 1-4. Exemplo 1-4. Mostrando o caminho de classe da dependncia
<target name=print-classpath description=Show the dependency class path> <property name=class.path refid=dependency.classpath/> <echo>${class.path}</echo> </target>
Tente executar esse alvo. O resultado ter variaes, dependendo de qual sistema operacional voc est usando, mas voc perceber que o caminho de classe da dependncia se refere ao seu repositrio local do Maven. Em uma mquina 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 diretrio ~/.m2/repository. Voc tambm perceber que existem mais dependncias listadas no caminho de classe do que foi declarado no elemento artifact:dependencies em build.xml. Essas dependncias extras so chamadas de dependncias transitrias, e so dependncias de suas dependncias 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 configuraes completas das dependncias para o seu projeto. Se explorar seu repositrio local depois de ter construdo um dos exemplos, voc ver que perto de todo artefato JAR h um arquivo com a extenso .pom. Os arquivos Project Object Model files (or POMs) so a fundao do sistema de construo e repositrio do Maven. Cada POM descreve um artefato e as dependncias daquele artefato. As Tarefas Ant Maven usam esses metadados para construir uma rvore de dependncias transitrias. Em outras palavras, as Tarefas Ant Maven no 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?
Graas s Tarefas Ant Maven, voc teve menos dificuldades para encontrar, baixar, expandir e organizar o software do que os leitores da verso anterior deste livro. Voc est no ponto ideal para comear a trabalhar com o Hibernate e, como voc ver no prximo captulo, passaremos muito rapidamente. Voc poder ver o cdigo 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 genunos...) Parece interessante? Bem, comparado com o que fizemos at aqui? Ento vamos comear com tudo para acordar o poder do Hibernate.