Auto Create Schema Script com: Ant, Hibernate 3 e JPA 2

Olá, tudo bem?

Já reparou como é chato criar script na unha? É complicado o desenvolvedor ter que saber a sintaxe de um “create table” para cada banco de dados. Digamos que as vezes é dificil se lembrar de como declarar uma coluna String para Oracle, ou Microsoft SQL Server, MySQL e assim vai.

Para melhorar essa situação podemos contar com a ajuda do Hibernate para gerar esse script por nós.

O hibernate pode nos ajudar com o banco de dados de dois modos: gerando arquivos do tipo sql e realizando a atualização de modo automático – sem scripts.

Resumindo o modo automático:
O modo automático foi mostrado no post Tutorial Hibernate 3 com JPA 2. Basta adicionar o código abaixo no “persistence.xml” que sua aplicação irá automaticamente atualizar o banco de dados:

<property name="hibernate.hbm2ddl.auto" value="update"/>

Volto a lembrar: "Não é aconselhável deixar essa opção ativa em produção. Você estará atualizando dados importantes e que não podem ser perdidos. O ideal seria um arquivo contendo os scripts e ele fazendo a atualização do banco de dados. Por exemplo, com o arquivo, um DBA poderá analisar o impacto da alteração de modo mais claro."

Gerar automaticamente o script inclusive com o schema elimina em parte o erro humano. Alguns erros comuns são: falta do schema no script, algum identificador de chave primária, FK, erro de sintaxe e assim vai.

Chega de papo e vamos aos códigos. Estaremos utilizando exatamente o código do primeiro post desse assunto de Business: Tutorial Hibernate 3 com JPA 2.

Vamos trabalhar com uma ferramenta chamada Ant. Nada mais é do que um executador de tarefas. Ele executa as tarefas listadas em um arquivo corretamente configurado. Vamos começar por esse arquivo.

Crie um arquivo chamado “build.xml” na raiz do projeto. Botão direito em cima do nome do projeto > New > File. Coloque o nome e clique em “Finish”.

Auto Create Schema Ant Hibernate 3 e JPA 2
Dê um duplo clique no arquivo criado para começar sua edição.

Iremos criar um simples “Hello World” para testar o funcionamento. Abaixo veja como ficará o primeiro código:

<project name="HibernateJPA" basedir=".">
    <target name="Hello">
        <echo message="Hello World Ant!"  />
    </target>
</project>

Veja que criamos algo chamado “target”. O “target” é uma ação no ant, ou seja, toda ação realizada tem que estar dentro de um “target”. Podemos ter quantos quiser.

A mensagem de Hello World será exibida em nosso console.

Por último, vamos adicionar a view do ant o nosso arquivo “build.xml” (caso você não saiba, veja como adicionar uma view aqui Criando um WebServer). Para adicioná-lo, você terá que arrastar o arquivo “build.xml” para dentro da view “Ant”. Dê um duplo clique em cima da target Hello e nossa mensagem será exibida na view do Console.
Auto Create Schema Ant Hibernate 3 e JPA 2
Auto Create Schema Ant Hibernate 3 e JPA 2

Precisamos fazer o download do Hibernate Tools que é o responsável por gerar o código. Eu utilizei o jar encontrado aqui (Hibernate Tools), mas caso queira pegar no site do Hibernate, você terá que baixar o JBoss Tools; e dentro dele você encontrará o Hibernate Tools.

Descompacte o arquivo .zip e coloque a biblioteca .jar dentro da nossa pasta lib (caso tenha problemas no nosso primeiro post esse processo é feito detalhadamente. Tutorial Hibernate 3 com JPA 2).

Precisamos agora adicionar nossa lib ao Build Path (Caso tenha dúvidas de como fazer, no primeiro post tem a explicação passo a passo Tutorial Hibernate 3 com JPA 2).
Auto Create Schema Ant Hibernate 3 e JPA 2

Vamos adicionar em nosso arquivo “build.xml” os diretórios necessários:

<project name="HibernateJPA" basedir=".">
    <property name="compiledFiles" location="bin" />
    <property name="libraries" location="lib" />
    <property name="sql" location="sql" />

    <path id="lib.path">
        <pathelement location="${libraries}" />
        <fileset dir="${libraries}">
            <include name="*.jar" />
        </fileset>
    </path>

    <target name="Hello">
        <echo message="Hello World Ant!"/>
    </target>
</project>

Veja que foram adicionados os caminhos onde o Ant encontrará as bibliotecas, os arquivos compilados e nossa futura pasta do SQL. Um detalhe é que o Eclipse, dependendo de como está configurado, pode esta escondendo a pasta “bin” dos seus olhos. Mas caso você escolha ver pelo Windows encontrará a essa pasta dentro do seu sistema, na pasta do …/workspace/seuprojeto/bin.

E por último, vamos ver o esperado código que gera o arquivo “sql”:

<project name="HibernateJPA" basedir=".">
    <property name="compiledFiles" location="bin" />
    <property name="libraries" location="lib" />
    <property name="sql" location="sql" />

    <path id="lib.path">
        <pathelement location="${libraries}" />
        <fileset dir="${libraries}">
            <include name="*.jar" />
        </fileset>
    </path>

    <target name="Create MySchema" description="Export schema to DDL file">
        <taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask" classpathref="lib.path" />
        <mkdir dir="${sql}" />
        <touch file="${sql}/script.sql" />
        <hibernatetool destdir="sql">
            <jpaconfiguration persistenceunit="Hello" />
            <classpath>
                <path location="${compiledFiles}" />
            </classpath>
            <hbm2ddl outputfilename="script.sql" format="true" export="false" drop="true" />
        </hibernatetool>
        <echo message="The file was saved in: ${sql}" />
    </target>    

    <target name="Hello">
        <echo message="Hello World Ant!"/>
    </target>
</project>

Após executar, será exibida uma mensagem exibindo o local em que o arquivo foi salvo (clique sobre o projeto e selecione “Refresh” e a pasta sql irá aparecer).
Auto Create Schema Ant Hibernate 3 e JPA 2

Mas talvez você ainda esteja pensando: “Uau, grande coisa. O script não foi gerado com o schema, vou ter que colocar tudo manualmente. Não me ajuda em nada.”

Para fechar, vamos fazer com que o script seja gerado já apontando o schema também. Vamos adicionar a seguinte linha ao nosso “persistence.xml”:

<property name="hibernate.default_schema" value="Hello"/>

Com essa linha de comando o Hibernate irá gerar o script com um schema padrão. Nosso arquivo “persistence.xml” ficará assim:

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="Hello" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <properties>
            <property name="hibernate.show_sql" value="true" />
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/Hello"/>
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="root" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.default_schema" value="Hello"/>
    </persistence-unit>
</persistence>

Repare que o código que estava antes, o que alterava o banco de de dados automaticamente, foi retirado. Apenas para deixar claro que uma vez que temos um script gerado não existe motivo para um update automático, realizado pela aplicação, no banco de dados.

Vamos gerar novamente o arquivo de script. Veja agora que nosso script será criado com o schema padrão na frente.

Caso queira gerar o script para outro banco de dados, basta alterar os valores das chaves “javax.persistence.jdbc.driver” e “hibernate.dialect”. Faça o download dos conectores devidos e pronto.

Espero que esse post seja útil a você.

Qualquer comentário/dúvida/crítica basta postar abaixo.

Até a próxima.

Revisado por: Renan Alves dos Santos

4 thoughts on “Auto Create Schema Script com: Ant, Hibernate 3 e JPA 2

  1. Olá, aqui ta dando erro nessa linha:

    BUILD FAILED
    DiretórioDoProjetolib does not exist.

    Minha pasta lib fica na pasta WEB-INF

    Alguma ideia?

    Obrigado.

    • Fabio, bom dia.

      Note que o caminho da pasta lib no projeto é diferente de WEB/lib.

      Você tem que configurar para o caminho ser o mesmo.

      Obrigado pela visita.

  2. Boa noite!

    Estou tentando criar um schema automaticamente, em tempo de execução na minha aplicação.

    Minha aplicação é descktop e estou usando Maven para gerenciar as dependências do projeto. Para persistência de dados, estou usando o JPA com Hibernate. O projeto é do tipo Javafx, e a versão do Java que estou usando é a 8.
    Neste caso, eu não tenho uma pasta lib, o que tenho é o “Maven Dependencies”.

    Tentei seguir este exemplo, criei o arquivo build.xml e fiz algumas alterações necessárias para que o exemplo atenda a minha necessidade, no entanto, não estou conseguindo obter o resultado esperado, que é a criação do schema no Mysql.
    Minha aplicação não está encontrando, nem executando o build.xml. Já fiz o refresh e dei clean na aplicação, mas nada acontece.

    O que fazer para resolver?

    • Leonardo, boa tarde.

      Infelizmente não sei qual o problema.

      O que eu posso dizer é:

      • Você terá que fazer a primeira chamada ao banco de dados para que o banco seja criado. Poder ser que nesse momento uma mensagem de erro seja exibida
      • Confira se as bibliotecas do JPA estão no classpath do seu projeto
      • Confira se o persistence.xml está na pasta META-INF

Leave a Comment