10 votos

Hibernate Spatial 4 y Postgis 2.0

Estoy teniendo algunos problemas con la integración de estas tecnologías:

  • Hibernate Spatial 4.0-M1
  • Postgis 2.0.2 (con jdbc 2.0.2 compilado)
  • Hibernate 4.1.1

El error específico es:

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.

La anotación de la entidad es:

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

Y el ejemplo de creación de puntos es:

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);

Gracias.

5voto

miguelcobain Puntos 156

Estaba usando Tomcat, y sus facilidades de pooling de conexiones. Acabo de exponer una fuente de datos a mi aplicación a través de JNDI .

Esto es lo que me ha funcionado:

  • Cuando incluí la dependencia de maven para hibernate-spatial, tiene una dependencia transitiva para el propio hibernate, el jdbc de postgresql y el jdbc de postgis. Así que lo que hice fue eliminar estas dependencias (obsoletas). Mi pom tiene el siguiente aspecto:

    <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>

Postgis jdbc es la extensión de postgresql jdbc que necesita.

  • Luego cloné repositorio postgis y compilar su extensión jdbc. Sólo hay que ejecutar mvn package en el java/jdbc directorio. Lea su léame.
  • Luego coloqué el postgresql-jdbc más reciente y el postgis jdbc recientemente compilado en el tomcat's lib directorio
  • En la configuración del servidor de tomcat, he cambiado la url de la base de datos a jdbc:postgresql_postGIS://localhost:5432/mydatabase . Fíjese en el postgresql_postGIS parte. También he cambiado la clase de conductor a org.postgis.DriverWrapper . Este es un wrapper que registra los tipos de postgis con el jdbc nativo.

Aquí está mi configuración final de recursos en 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 procedimiento se describe generalmente en el README de postgis jdbc. Así que asegúrese de que leerlo .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X