Hibernate Spatial 4 et PostGIS 2.0

10

J'ai des problèmes pour intégrer ces technologies:

  • Hibernate Spatial 4.0-M1
  • PostGIS 2.0.2 (avec JDBC 2.0.2 compilé)
  • Hibernate 4.1.1

L'erreur spécifique est:

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'annotation d'entité est:

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

Et l'exemple de création de point est:

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

Réponses:

5

J'utilisais Tomcat et ses installations de mise en commun des connexions. Je viens d'exposer une source de données à mon application via JNDI .

Voici ce qui a fonctionné pour moi:

  • Lorsque j'ai inclus la dépendance maven pour hibernate-spatial, elle a une dépendance transitive pour hibernate lui-même, jdbc de postgresql et jdbc de postgis. J'ai donc supprimé ces dépendances (obsolètes). Mon pom ressemble à ceci:
<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 est l'extension dont vous avez besoin pour postgresql jdbc.

  • Ensuite, j'ai cloné le référentiel postgis et compilé leur extension jdbc. Exécutez simplement mvn packagedans le java/jdbcrépertoire. Lisez son readme.
  • J'ai ensuite placé le postgresql-jdbc le plus récent et le postgis jdbc récemment compilé dans le librépertoire du tomcat
  • Sur la configuration du serveur du tomcat, j'ai changé l'URL de la base de données en jdbc:postgresql_postGIS://localhost:5432/mydatabase. Remarquez la postgresql_postGISpièce. J'ai également changé la classe de pilote en org.postgis.DriverWrapper. Il s'agit d'un wrapper qui enregistre les types postgis avec le jdbc natif.

Voici ma configuration de ressources finale dans 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"/>

Cette procédure est généralement décrite dans le fichier README de postgis jdbc. Assurez-vous donc de le lire .

miguelcobain
la source