我可以从我的代码中将几何数据插入到数据库中,但我只能使用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
我完全迷失在这里,没有想法。请帮忙。 感谢
答案 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:就我而言,问题仅出现在客户的系统上;我们的开发服务器还可以-两种配置之间没有明显的区别。