Hibernate Spatial 4 und PostGIS 2.0

10

Ich habe einige Probleme bei der Integration dieser Technologien:

  • Spatial 4.0-M1 im Ruhezustand
  • PostGIS 2.0.2 (mit kompiliertem JDBC 2.0.2)
  • Ruhezustand 4.1.1

Der spezifische Fehler ist:

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.

Die Annotation der Entität lautet:

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

Das Beispiel für die Punkterstellung lautet:

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
quelle

Antworten:

5

Ich habe Tomcat verwendet und es verfügt über Verbindungspooling-Funktionen. Ich habe gerade eine Datenquelle über JNDI für meine Anwendung verfügbar gemacht .

Folgendes hat bei mir funktioniert:

  • Wenn ich die Maven-Abhängigkeit für den Ruhezustand einschließt, hat sie eine transitive Abhängigkeit für den Ruhezustand selbst, das jdbc von postgresql und das jdbc von postgis. Also habe ich diese Abhängigkeiten entfernt (veraltet). Mein Pom sieht so aus:
<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 ist die Erweiterung zu postgresql jdbc, die Sie benötigen.

  • Dann habe ich das Postgis-Repository geklont und die JDBC-Erweiterung kompiliert. Einfach mvn packageim java/jdbcVerzeichnis ausführen . Lesen Sie die Readme-Datei.
  • Dann habe ich das neueste postgresql-jdbc und das kürzlich kompilierte postgis jdbc in das libVerzeichnis des Kater gelegt
  • In der Serverkonfiguration des Tomcat habe ich die Datenbank-URL in geändert jdbc:postgresql_postGIS://localhost:5432/mydatabase. Beachten Sie das postgresql_postGISTeil. Ich habe auch die Fahrerklasse auf geändert org.postgis.DriverWrapper. Dies ist ein Wrapper, der Postgis-Typen beim nativen JDBC registriert.

Hier ist meine endgültige Ressourcenkonfiguration 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"/>

Dieses Verfahren wird allgemein in der README von postgis jdbc beschrieben. Lesen Sie es also unbedingt durch .

Miguelcobain
quelle