Diego Plentz

28 Mar, 2007

Hibernate com PostGIS

Posted by: Diego Plentz In: hibernate| java

Green pentagons

Uns meses atrás tive um problema com o uso do Hibernate, em um caso um tanto quanto incomum: o projeto usava Ingres, um banco de dados muito pouco usado, e com algumas particularidades idiotas (sendo gentíl com eles). O tipo responsável por armazenar as datas no Ingres, diferentemente de todos os outros bancos que já vi, aceita três “estados” nas colunas de data: uma data (óbvio), null, - sim, uma empty string.

Com isto, eu não poderia usar as classes padrão para datas no Java, acabei criando uma classe Data para tratar desses estados. Como o tipo foi criado por mim, o Hibernate não oferece nada pronto (por razões óbvias), tive que achar uma alternativa.

Lendo um pouco a referência, mais especificamente o capítulo Custom value types, descobri que para esses casos especiais, onde muitos já apelariam para alguma forma menos ortodoxa, o Hibernate oferece um mecanismo muito poderoso : os UserTypes.

Um UserType é basicamente uma interface que permite a implementação de como um determinado tipo será recuperado e persistido no seu banco de dados. Este recurso é extremamente útil e me salvou graciosamente.

E porque estou escrevendo isso tudo? Recebi hoje uma dúvida bem interessante por mensagem privada no GUJ. O usuário perguntava se haveria possibilidade de usar Hibernate em conjunto com o banco PostGIS - focado em armazenar dados geométricos.

O principal desafio é como mapear os dados que são armazenados em Geometry, como são chamados os tipos geométricos no PostGIS. Como não existe nenhum tipo nativo do Java que seria correspondente (e nem a especificação do JDBC preve isso - tipos clob, lobs e variantes não contam!), o trabalho pode ser um pouco mais complicado que se imagina.

Dando uma pesquisada, acabei encontrado uma thread da lista de users do PostGIS que trata exatamente disso. Nela é apresentada uma solução elegante para o tratamento dos tipos no Hibernate - e que acabou virando parte do projeto. SpatialEJB3 nada mais é que um UserType (GeometryType no caso) com a implementação responsável por tratar o tipo Geometry. Ele pode ser usadao tanto com Hibernate puro, quanto para EJB3. Só achei estranho que as classes ainda não estão no postgis.jar.

Para usar o recurso, fica extremamente simples:

@Type(type = "org.postgis.hibernate.GeometryType")
public Geometry getLocation(){
return location;
}

No site é possível encontrar a documentação do projeto.

Popularity: 21% [?]

No Responses to "Hibernate com PostGIS"

Comment Form


  • Rodrigo Amaral Rosa: Olá Diego, como disse antes funcionou tudo certo no tutorial. Mas eu quis seguir um pouco mais além, configurando virtualhost no apache para o meu d
  • éricoulisses: absurdo: não consegui passar de 50kbps com o pacote de 500kbps, se cheguei a 50 foi um milagre, só fiz download de uma música e pronto, kkkkkk,
  • Tony Amorim: Ótimo Tutorial, parabéns.... Estou com problemas com pool de conexão no tomcat, não está funcionando. Funciona com o tomcat sózinho. Tony

Flickr PhotoStream

  • IMG_3498
  • IMG_3458
  • IMG_3450
  • IMG_3473
  • IMG_3469
  • IMG_3464
  • IMG_3444
  • IMG_3402

About

This is an example of a WordPress page, you could edit this to put information about yourself or your site so readers know where you are coming from.