收到org.postgresql.util.PGobject类型的对象

时间:2017-09-11 20:57:58

标签: postgresql hibernate wildfly postgis hibernate-spatial

我可以从我的代码中将几何数据插入到数据库中,但我只能使用SQL编辑器查询数据,例如PGAdmin III。我无法将几何数据检索回我的代码。每次尝试都以:"收到类型为org.postgresql.util.PGobject"的对象。即使运行一个简单的查询来测试两个几何值是否相等,我也会收到此错误。

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.Polygon;
import javax.persistence.Column;

@Entity
public class PontodeInteresse implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    private String descricao;

    @Column(columnDefinition = "geometry(Point,4326)")
    private Point ponto;

    @Column(columnDefinition = "geometry(LineString,4326)")
    private LineString linha;

    @Column(columnDefinition = "geometry(Geometry,4326)")
    private Geometry geometry;

    @Column(columnDefinition = "geometry(Polygon,4326)")
    private Polygon poligono;

我正在使用: - Hibernate 5.2 - PostgreSQL 9.6 - Postgis 2.3 - JDBC驱动程序PostgreSQL 42.1.4 - Wildfly 11(CR1)

这是模型类:

<dependencies>
    <dependency>
        <groupId>org.primefaces</groupId>
        <artifactId>primefaces</artifactId>
        <version>6.1</version>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>6.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.vividsolutions</groupId>
        <artifactId>jts</artifactId>
        <version>1.13</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-spatial</artifactId>
        <version>5.2.10.Final</version>
   </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.10.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.2.10.Final</version>
    </dependency>
    <dependency>
       <groupId>dom4j</groupId>
       <artifactId>dom4j</artifactId>
       <version>1.6.1</version>
       <scope>provided</scope>
    </dependency>
</dependencies>

POM文件:

<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisPG95Dialect"/>

在persistence.xml文件中,我使用了这个方言属性:

public void testar() {
    try {
        GeometryFactory gf = new GeometryFactory();

        LinearRing shell = gf.createLinearRing(new Coordinate[] {
                                    new Coordinate(-43.56006145477295,-22.8861191211294), new Coordinate(-43.55607032775879,-22.8861191211294),
                                    new Coordinate(-43.55607032775879,-22.88279796969916), new Coordinate(-43.56006145477295,-22.88279796969916),
                                    new Coordinate(-43.56006145477295,-22.8861191211294)});
        LinearRing[] holes = new LinearRing[0];
        Polygon polygon = gf.createPolygon(shell, holes);
        polygon.setSRID(4326);

        Query q = entityManager.createQuery("from PontodeInteresse where equals(geometry, :geo) = true").setParameter("geo", polygon);
        List<PontodeInteresse> pontos = q.getResultList();            

    } catch(Exception e) {
        System.out.println(e.getMessage());
    }//try
}

PS:我已经尝试过PostgisDialect

最后,该方法使用简单的测试查询:

threshold

我完全迷失在这里,没有想法。请帮忙。 感谢

2 个答案:

答案 0 :(得分:3)

在部署应用程序之前,您需要将Postgis,hibernate-spatial和其他相关的lib添加到Wildfly,这是因为您使用的hibernate是与wildfly绑定的,但其他库与您的战争捆绑在一起,所以他们使用不同的类加载器。

如果您检查this code,您可以看到演员表是正确的,并且错误消息没有意义,这对于类加载器来说是个问题。

要解决此问题,您需要将所有库添加到您的wildfly,为此您可以这样做:

cd $JBOSS_PATH/modules/system/layers/base/org/hibernate/main
mvn dependency:copy -Dartifact=org.hibernate:hibernate-spatial:5.0.7.Final:jar -DoutputDirectory=.
mvn dependency:copy -Dartifact=org.geolatte:geolatte-geom:1.0.1:jar -DoutputDirectory=.
mvn dependency:copy -Dartifact=com.vividsolutions:jts:1.13:jar -DoutputDirectory=.

编辑module.xml文件以添加您的代码:

<resource-root path="hibernate-spatial-5.0.7.Final.jar"/>
<resource-root path="jts-1.13.jar"/>
<resource-root path="geolatte-geom-1.0.1.jar"/>

在依赖项标记中,添加:

<module name="org.slf4j"/>

此外,如果您使用的是postgresql,则需要添加依赖项标记:

<module name="org.postgresql"/>

使用mvn命令中的正确版本下载正确的jar。

答案 1 :(得分:0)

这不仅适用于Wildfly:通过将PostgreSQL jar从[tomcat] \ webapps [WebApp] \ WEB-INF \ lib移至[tomcat] \ lib,我能够在Tomcat上解决同一问题。

btw:就我而言,问题仅出现在客户的系统上;我们的开发服务器还可以-两种配置之间没有明显的区别。