Página Inicial > GIS, Hibernate, Java, SQL > Hibernate Spatial + Postgis: Uma Introdução

Hibernate Spatial + Postgis: Uma Introdução

Esse tutorial tem como objetivo fazer uma introdução ao uso do Hibernate Spatial juntamente com o banco de dados postgresql e a extensão espacial postgis. Nesse exemplo estarei utilizando o netbeans 6.8.

Para começar, crie um projeto Java no netbeans, clique com o botão direito sobre o projeto e adicione as bibliotecas do “Hibernate” e “Hibernate JPA” ambas disponíveis no netbeans.

Você também irá precisar das seguintes bibliotecas:

Adicione todas as listadas acima ao projeto.

Agora iremos criar o hibernate.cfg.xml, o próprio netbeans fornece um utilitário para criação. Clique com o botão direito no projeto, selecione o menu Novo -> Outro -> Hibernate -> Assistente para configuração do hibernate.

Configure seu hibernate da seguinte maneira:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost/teste</property>
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.connection.password">web</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <mapping class="modelo.Evento"/>
  </session-factory>
</hibernate-configuration>

Agora iremos criar a classe “Eventos” que será nossa entidade. Ela irá conter o atributo Id que será um inteiro, descrição que será uma string contendo a descrição e o atributo ponto que será do tipo geográfico “Point”.


package modelo;

import com.vividsolutions.jts.geom.Point;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.annotations.Type;

/**
 *
 * @author lucas
 */
@Entity
public class Evento implements Serializable {

    @Id
    @GeneratedValue
    private long id;
    private String descricao;
    @Type(type="org.hibernatespatial.GeometryUserType")
    @Column(columnDefinition="Point")
    private Point ponto;

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Point getPonto() {
        return ponto;
    }

    public void setPonto(Point ponto) {
        this.ponto = ponto;
    }
}

Agora criaremos a classe HibernateUtil, que possuirá um atributo SessionFactory do hibernate, um método que retorne uma Session criada pelo SessionFactory e um bloco de código, todos estáticos. O próprio netbeans possui uma opção de criar automaticamente o HibernateUtil, ela está no mesmo menu que foi usado anteriormente para gerar o arquivo de configuração.

package util;

import org.hibernate.Session;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

public class HibernateUtil {
    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() {
        return sessionFactory.openSession();
    }
}

Criaremos agora a classe que irá ler a configuração do hibernate e a partir dos mapeamentos das classes irá gerar automaticamente as tabelas do banco.

package util;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

/**
 *
 * @author lucas
 */
public class GeraBanco {

    public static void main(String args[]){

        Configuration conf = new AnnotationConfiguration();
        conf.configure();
        SchemaExport se = new SchemaExport(conf);
        se.create(true, true);
    }
}

O próximo passo é mapear a entidade Evento no hibernate, para isso adicionaremos abaixo do último ‘property’ a linha a seguir:

 <mapping class="modelo.Evento"/>

Deixando o hibernate.cfg.xml da seguinte maneira:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost/teste</property>
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.connection.password">web</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <mapping class="modelo.Evento"/>
  </session-factory>
</hibernate-configuration>

E por fim iremos trabalhar na classe main:


import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
import modelo.Evento;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;

/**
 *
 * @author lucas
 */
public class Main {

    public static void main(String[] args) {

        Evento evento = new Evento();
        evento.setDescricao("Testando");
        Geometry geom = null;
        evento.setPonto((Point) geom);

        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();

        session.save(evento);
        tx.commit();
        session.close();
    }
}

Agora rode o GeraBanco para que a tabela do banco seja criada e em seguinda o main. Após fazer isso dê uma conferida no banco e se tiver ocorrido tudo bem o registro estará lá.

  1. 6, janeiro, 2010 em 12:37 | #1

    Lucas,

    Parabéns pela simplicidade e objetividade do tutorial.

    abraços,

    Otávio

  2. Jefferson
    29, janeiro, 2010 em 19:46 | #2

    Como pode ser feito para o Hibernate atualizar as tabelas do banco sem apagar os registros?
    no xml ja tentei colcocar mas mesmo assim zera todos os registros do banco

  3. Robert
    5, fevereiro, 2010 em 16:57 | #3

    Lucas,

    O mais correto seria utilizar o dialeto do Postigis: org.hibernatespatial.postgis.PostgisDialect.

    Parabéns!

  4. Diego
    19, fevereiro, 2010 em 00:20 | #4

    Cara. Bom tutorial.
    Uma dúvida que tenho é a seguinte:
    Isso tudo manipula os beans geométricos, grava, recupera e tal.
    Mas a questão de apresentação para o usuário (quadrados, linhas, círculos etc) de formas obtidas desta forma, como eu faço isto?
    Abraços.
    Diego

  5. 20, fevereiro, 2010 em 22:34 | #5

    Diego, para camada de apresentação você pode utilizar o GeoServer, MapServer, google maps a escolha é sua. Inclusive, há varios componentes JSF para trabalhar com exibição de dados geograficos.

  6. Marcos
    19, junho, 2010 em 13:15 | #6

    @Robert
    Boa observação

  7. Marcos
    19, junho, 2010 em 13:16 | #7

    @Diego
    Você também pode usar um software desktop como o Udig, criando uma conexão direta com seu banco de dados.

  8. Jhonys
    26, junho, 2010 em 14:51 | #8

    Parabéns pelo tutorial Lucas!!

    Se eu utilizar o PostgisDialect terei que adicionar o PostgreSQLDialect também?

    Se você fizesse um tutorial mostrando como efetuar consultas com Hibernate Spatial eria muito interessante.

    Um abraço! Parabéns pelo trabalho rapaz!!!

  9. 29, julho, 2010 em 19:09 | #9

    Parabéns meu amigo, continue se interessado pela área de WebGIS e BDG, você vai longe!!!

  10. wisley
    4, setembro, 2010 em 13:15 | #10

    sua intenção foi muio boa, ajuda que não tem noção…

    mas se tu não demostrar como inserir dados fica dificil, com null é muito facil, acho que o null desvirtuou a real intenção do tópico, vou fazer no meu blog…

  1. Nenhum trackback ainda.