Hibernate Spatial 4 e PostGIS 2.0


10

Sto riscontrando alcuni problemi con l'integrazione di queste tecnologie:

  • Hibernate Spatial 4.0-M1
  • PostGIS 2.0.2 (con JDBC 2.0.2 compilato)
  • Ibernazione 4.1.1

L'errore specifico è:

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.

L'annotazione dell'entità è:

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

E l'esempio di creazione del punto è:

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

Risposte:


5

Stavo usando Tomcat ed è un servizio di pooling di connessioni. Ho appena esposto un'origine dati alla mia applicazione tramite JNDI .

Ecco cosa ha funzionato per me:

  • Quando ho incluso la dipendenza maven per l'ibernazione-spaziale, ha una dipendenza transitiva per l'ibernazione stessa, jdbc di postgresql e jdbc di postgis. Quindi quello che ho fatto è stato rimuovere queste dipendenze (obsolete). Il mio pom assomiglia a questo:
<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 è l'estensione di postgresql jdbc di cui hai bisogno.

  • Quindi ho clonato il repository postgis e compilato la loro estensione jdbc. Esegui mvn packagenella java/jdbcdirectory. Leggi il suo readme.
  • Quindi ho inserito il postgresql-jdbc più recente e il postgis jdbc compilato di recente nella libdirectory di tomcat
  • Sulla configurazione del server di Tomcat, ho cambiato l'URL del database in jdbc:postgresql_postGIS://localhost:5432/mydatabase. Notare la postgresql_postGISparte. Ho anche cambiato la classe del conducente in org.postgis.DriverWrapper. Questo è un wrapper che registra i tipi di postgis con il jdbc nativo.

Ecco la mia configurazione finale delle risorse in 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"/>

Questa procedura è generalmente descritta nel file README di Postgis jdbc. Quindi assicurati di leggerlo .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.