在我的PostgreSQL 9.3 + PostGIS 2.1.5中,我有一个表PLACE,其列coordinates
类型为Geometry(Point,26910)
。
我想将其映射到 使用Hibernate 4.0.0 +
的PlaceSpring Boot 1.1.9 Web
应用程序中的实体
。PlaceREST
存储库中可用。
不幸的是,当我GET http://localhost:8080/mywebapp/places
收到
这个奇怪的JSON响应时:
{
"_embedded" : {
"venues" : [ {
"id" : 1,
"coordinates" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
"envelope" : {
等等等等……!Spring日志没有帮助..
我正在使用此application.properties:
spring.jpa.database-platform=org.hibernate.spatial.dialect.postgis.PostgisDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:postgresql://192.168.1.123/mywebapp
spring.datasource.username=postgres
spring.datasource.password=mypwd
spring.datasource.driverClassName=org.postgresql.Driver
首先,可以使用database-platform代替database吗?而也许我必须使用以下设置,而不是上面?
spring.datasource.url=jdbc:postgresql_postGIS://192.168.1.123/mywebapp
spring.datasource.driverClassName=org.postgis.DriverWrapper
无论如何,我的实体是这样的:
@Entity
public class Place {
@Id
public int id;
@Column(columnDefinition="Geometry")
@Type(type="org.hibernate.spatial.GeometryType") //"org.hibernatespatial.GeometryUserType" seems to be for older versions of Hibernate Spatial
public com.vividsolutions.jts.geom.Point coordinates;
}
我的pom.xml包含以下相关部分:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.3-1102-jdbc41</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-spatial</artifactId>
<version>4.3</version><!-- compatible with Hibernate 4.3.x -->
<exclusions>
<exclusion>
<artifactId>postgresql</artifactId>
<groupId>postgresql</groupId>
</exclusion>
</exclusions>
</dependency>
有点奇怪的配置,我在互联网上找到了,它是目前最有效的配置。
我希望有人可以帮助我解决这个问题。:)
最后,我发现我的配置是OK,可能是杰克逊是无法管理Point正确的数据类型。因此,我自定义了其JSON序列化和反序列化:
将这些注释添加到我们的coordinates字段中:
@JsonSerialize(using = PointToJsonSerializer.class)
@JsonDeserialize(using = JsonToPointDeserializer.class)
创建这样的序列化器:
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.vividsolutions.jts.geom.Point;
公共类PointToJsonSerializer扩展了JsonSerializer [HTML_REMOVED] {
@Override
public void serialize(Point value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
String jsonValue = "null";
try
{
if(value != null) {
double lat = value.getY();
double lon = value.getX();
jsonValue = String.format("POINT (%s %s)", lat, lon);
}
}
catch(Exception e) {}
jgen.writeString(jsonValue);
}
}
创建这样的反序列化器:
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.PrecisionModel;
public class JsonToPointDeserializer extends JsonDeserializer
private final static GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 26910);
@Override
public Point deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
try {
String text = jp.getText();
if(text == null || text.length() <= 0)
return null;
String[] coordinates = text.replaceFirst("POINT ?\\(", "").replaceFirst("\\)", "").split(" ");
double lat = Double.parseDouble(coordinates[0]);
double lon = Double.parseDouble(coordinates[1]);
Point point = geometryFactory.createPoint(new Coordinate(lat, lon));
return point;
}
catch(Exception e){
return null;
}
}
}
Maybe you can also use this
serializer and this
deserializer, available
here.
hibernate 5.1 spatial的文档尚未发布(AFAIK),我正在尝试将带有JST几何字段的实体持久化到PostgreSQL 9.5 Postgis 2.2,但没有任何运气。 我也注意到没有组织。冬眠hibernate-core-5.1中的空间包。0.我尝试了以下注释的变体: 当列定义设置为“点”时,我得到“列”the_geom“是点的类型,但表达式是由茶的类型”。在Hibernate
与上一个问题有关。我有一个SpringRoo应用程序,它使用Hibernate使用JTS将几何体对象写入PostGIS数据库。我相信我已经解决了定义Geometry对象时遇到的问题,现在Hibernate正在执行其persist()方法,但是在它到达DB之前出现了一些问题,我得到了下面的异常。 这里有一些有趣的台词。首先从Hibernate日志、要持久化的对象,然后是一个SQL查询(可能替换了?)
我需要使用nHibernate读取postgis几何列作为wkt。我知道我可以使用nHibernate空间,但在我的情况下这不是一个选项。 我看过这个帖子:在NHibernate (fluent)中映射隐藏属性的最佳方式,其中wkt存储在另一列中,他使用触发器来更新实际的几何图形。然而,项目业主不希望为此增加一个额外的栏目。 我也发现了这个主题:在Hibernate中透明地使用PostGIS列,但
我试图将一个几何体对象存储到我的postgist数据库中,该数据库有一个带有几何体列的表。我从另一个带有几何列的表格中得到了几何值,我打印了我之前得到的值,结果没问题。要存储几何体值,我使用下一个函数: 但我总是得到这个错误: 组织。postgresql。util。PSQLException:无法推断用于org实例的SQL类型。波斯吉斯。指向使用带有显式类型值的setObject()指定要使用的类
问题内容: 我想用Hibernate映射超类中的通用字段。 我的母亲班是: 一个子类: 如您所见,我将覆盖value字段以指定要在数据库中使用的列。我的表ParameterValue由几列组成,每种类型对应一列。 但是hibernate抱怨: 好的,但是超类中getValue的良好配置是什么?(我在“需要帮助的地方”发表了评论) 问题答案: 我很确定您不能将单个Java属性映射到三个不同的列。您将
我正在使用Hibernate和JPA注释来映射我的类。当hibernate尝试映射这个类时,我遇到了一个问题 我的Social alStat类是: 我得到了这个错误: 我猜发生这种情况是因为我试图映射到一个基本类,但@ElementCollection注释不应该解决这个问题吗? 我的item类如下所示:
数据源是具有PostGIS几何类型的PostgreSQL数据库。我可以使用包直接从SQL查询我想要的数据到data.frame。 由于 R 抱怨原始几何类型,因此我在 SQL 查询中对几何使用 以便将它们作为类型存储在 中。我有三种类型:、和。请注意,我的数据是几何(例如,笛卡尔x,y,z坐标),而不是地图投影的地理。 制作MWE有点困难,因为我必须用换行符分隔每个LINESTRING和POLYG
我想返回此SQL Postgis查询的输出(几何类型中的输出为“0101000000000000000002440000000000002440”) 用Java和hibernate。 我尝试了以下方法: 这对我不起作用。我得到以下异常 我想我明白问题是什么。我尝试将结果解析为字符串,但它是几何对象。但是我该怎么做才能在 Java 中将此输出作为字符串获取?如果我只在 SQL 查询后面添加 .lis