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:
- JTS-1.8.jar
- Hibernate-Spatial-1.0-M2.jar
- Hibernate-Spatial-postgis-1.0-M2.jar
- postgis-1.5.0SVN.jar
- postgresql-8.4-701.jdbc3.jar
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á.



Lucas,
Parabéns pela simplicidade e objetividade do tutorial.
abraços,
Otávio
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
Lucas,
O mais correto seria utilizar o dialeto do Postigis: org.hibernatespatial.postgis.PostgisDialect.
Parabéns!
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
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.
@Robert
Boa observação
@Diego
Você também pode usar um software desktop como o Udig, criando uma conexão direta com seu banco de dados.
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!!!
Parabéns meu amigo, continue se interessado pela área de WebGIS e BDG, você vai longe!!!
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…