Hibernate Spatial 4 e PostGIS 2.0

10

Estou tendo alguns problemas ao integrar essas tecnologias:

  • Hibernate Spatial 4.0-M1
  • PostGIS 2.0.2 (com JDBC 2.0.2 compilado)
  • Hibernate 4.1.1

O erro específico é:

Caused by: org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of org.postgis.PGgeometry. Use setObject() with an explicit Types value to specify the type to use.

A anotação da entidade é:

@NotNull
@Column(columnDefinition="Geometry")
@Type(type="org.hibernate.spatial.GeometryType")
private Point geom;

E o exemplo de criação de ponto é:

Location location = new Location();
WKTReader fromText = new WKTReader();
Point geom = null;
try {
    geom = (Point) fromText.read("POINT(-56.2564083434446 -34.8982159791812)");
} catch (ParseException e) {
    throw new RuntimeException("Not a WKT string:" + "SRID=4326;POINT(-56.2564083434446 -34.8982159791812)");
}
if (!geom.getGeometryType().equals("Point")) {
    throw new RuntimeException("Geometry must be a point. Got a " + geom.getGeometryType());
}
location.setGeom(geom);
locationDAO.insert(location);
gonzalomelov
fonte

Respostas:

5

Eu estava usando o Tomcat e é um recurso de pool de conexão. Acabei de expor uma fonte de dados ao meu aplicativo por meio do JNDI .

Aqui está o que funcionou para mim:

  • Quando incluí a dependência maven para hibernate-space, ela possui uma dependência transitiva para o próprio hibernate, o jdbc do postgresql e o jdbc do postgis. Então, o que eu fiz foi remover essas dependências (desatualizadas). Meu pom fica assim:
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-spatial</artifactId>
    <version>4.0</version>
    <exclusions>
        <exclusion>
            <artifactId>hibernate-core</artifactId>
            <groupId>org.hibernate</groupId>
        </exclusion>
        <exclusion>
            <artifactId>postgis-jdbc</artifactId>
            <groupId>org.postgis</groupId>
        </exclusion>
        <exclusion>
            <artifactId>postgresql</artifactId>
            <groupId>postgresql</groupId>
        </exclusion>
    </exclusions>
</dependency>

O Postgis jdbc é a extensão necessária para o postgresql jdbc.

  • Então eu clonei o repositório postgis e compilei sua extensão jdbc. Basta executar mvn packageno java/jdbcdiretório Leia seu leia-me.
  • Coloquei o postgresql-jdbc mais recente e o postgis jdbc recentemente compilado no libdiretório do tomcat
  • Na configuração do servidor do tomcat, alterei o URL do banco de dados para jdbc:postgresql_postGIS://localhost:5432/mydatabase. Observe a postgresql_postGISparte. Eu também mudei a classe do driver para org.postgis.DriverWrapper. Este é um wrapper que registra tipos postgis com o jdbc nativo.

Aqui está minha configuração final de recursos no tomcat:

<Resource auth="Container"
          maxActive="120" maxIdle="10" name="jdbc/myapp"
          username="myuser" password="mypassword"
          poolPreparedStatements="true" type="javax.sql.DataSource" 
          driverClassName="org.postgis.DriverWrapper"
          validatingQuery="select 1"
          url="jdbc:postgresql_postGIS://localhost:5432/myapp"/>

Este procedimento é geralmente descrito no README do postgis jdbc. Portanto, certifique-se de lê-lo .

miguelcobain
fonte