使用 Hibernate Spatial 从 PostGis 检索数据

Retrieving data from PostGis using Hibernate Spatial

我已经设置好 Wildfly 10、Hibernate Spatial 5.0.1 和 PostGis。我可以成功地将数据插入数据库(通过 psql 命令行检查)但是当我尝试从数据库读取时,出现以下错误:

Caused by: java.lang.IllegalStateException: Received object of type byte[]

这是我的实体:

import com.vividsolutions.jts.geom.Point;

 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;

@Entity
public class Location {

 /*Empty constructor used on Hibernate*/
 public Location() {
 }

 public Location(String name, Point point) {
    this.name = name;
    this.location = point;
 }

 @Id
 private String name;

 @Column(nullable = false)
 private Point location;
}

和我的方法:

public Location findByName(final String name) {
    Query query = entityManager.createQuery("select l from Location l where l.name=:name", Location.class);
    query.setParameter("name", name);
    List<Location> result = query.getResultList();
    if (result != null && result.size() > 0)
        return result.get(0);
    return null;
}

记住,我可以正确地向其中插入数据,但我无法读取。首先,我想到了 Hibernate Spatial 符号的一些不一致,一些对 pom.xml 的依赖性破坏或 persistence.xml 上的一些错误,但由于我会写,所以我认为情况并非如此。 Here 在方法 find 上,他的查询与我完全一样。我做错了什么?

你的问题和这个一样,基本上你需要在服务器(jboss/wildfly)中安装postgis和所有依赖项并将你的deps设置为provided

这是答案的正文:

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

如果您检查 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"/>

并在 dependencies 标签中,添加:

<module name="org.slf4j"/>

另外如果你使用的是postgresql,你需要添加依赖标签:

<module name="org.postgresql"/>

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