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: 12% [?]
2 Responses to Hibernate com PostGIS
Fernando Quadro - Mapeando dados geométricos com o Hibernate
May 4th, 2009 at 7:25 am
[...] Blog do Plentz No TweetBacks yet. (Be the first to Tweet this post)Posts RelacionadosGeoBI Open Source [...]
Caroline Julliê
February 5th, 2010 at 7:53 am
[..] Diego .. muito bacana seu artigo.
Tenho um projeto em geoprocessamento e gostaria de saber
se você pode me dar umas dicas. Quero usar o postGis e o Hibernate Spatial numa proposta meio ousada .. mas encontre-me cheias de dúvidas. Aguardo retorno.