使用 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。
我已经设置好 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
上,他的查询与我完全一样。我做错了什么?
你的问题和这个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。