首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >映射到com.vividsolutions.jts.geom.Point无效的端点标志

映射到com.vividsolutions.jts.geom.Point无效的端点标志
EN

Stack Overflow用户
提问于 2017-02-04 19:56:44
回答 1查看 1.4K关注 0票数 1

我正在做一个项目,在那里我将检索用户的经度和纬度。因此,我想将它作为Point存储到数据库中。但是,当我尝试这样做时,我遇到了以下错误:o.h.engine.jdbc.spi.SqlExceptionHelper : ERROR: Invalid endian flag value encountered.

我采用向客户端公开的模型,并将其映射如下:

代码语言:javascript
复制
 public static Point createPoint(double longitude, double latitude){
        GeometryFactory gf = new GeometryFactory();

        Coordinate coord = new Coordinate(longitude, latitude );
        Point point = gf.createPoint( coord );

        return point;
    }

因此,我将此方法大致如下所示,以将值映射为Point:

代码语言:javascript
复制
createPoint(user.getLocation().getLongitude(), user.getLocation().getLatitude());

然后将返回的值存储到数据库中。

我的pom文件有以下依赖项:

代码语言:javascript
复制
    <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.4.Final</version>
                <exclusions>
                    <exclusion>
                        <artifactId>postgresql</artifactId>
                        <groupId>postgresql</groupId>
                    </exclusion>
                </exclusions>
    </dependency>

jpa配置:

代码语言:javascript
复制
jpa:
        database: POSTGRESQL
        open-in-view: false
        show-sql: true
        hibernate:
            ddl-auto: none
            dialect: org.hibernate.spatial.dialect.postgis.PostgisDialect
            naming:
                naming-strategy: org.springframework.boot.orm.jpa.hibernate.SpringNamingStrategy

列定义:

代码语言:javascript
复制
@Column(name="point")
private com.vividsolutions.jts.geom.Point point;

对于如何纠正这个错误,我有什么想法吗?提前谢谢各位。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-04 21:51:30

有几种方法可以实现这一点,这完全取决于您希望如何将数据存储在底层数据存储中。

正如注释中所指出的,您可以使用AttributeConverter实现将Point坐标的xyz组件存储在由某个神奇字符分隔的单个列中:

代码语言:javascript
复制
public class PointerConverter implements AttributeConverter<Point, String> {
   @Override
   public String converToDatabaseColumn(Point point) {
     // read the x, y, z, construct a string delimited by some character and
     // return the value.  Hibernate will store this in your column.
   }

   @Override
   public Point convertToEntityAttribute(String value) {
     // split the value by the delimiter and construct a Point.
     // return the constructed Point to be set in the entity.
   }
}

这种方法的固有问题之一是,它使得查询Point坐标的各个部分几乎不可能。

如果您发现需要对Point进行查询,并提供构成Point坐标的各种xyz值,那么最好考虑:

  • 自定义UserType实现
  • 使用@Embeddable来表示持久性世界中的Point

对于自定义UserType,您需要定义一个新类型,在本例中可能称为PointType,它扩展了UserType,并按如下方式引用它:

代码语言:javascript
复制
@Type(type = "PointType")
@Columns({@Column(name = "X"), @Column(name="Y"), @Column(name="Z"))
private Point point;

自定义UserType将处理将点坐标的xyz部分映射到适当的列XYZ,反之亦然。

对于@Embeddable解决方案,只需创建自己的JpaPoint类,就可以在几何Point类中传递该类,用于读取xyz值,并将它们存储在持久性模型的3个属性中。然后,JpaPoint类还可以公开一个助手方法,允许调用者从可嵌入的JpaPoint生成一个Point

代码语言:javascript
复制
// ctor example
public JpaPoint(Point point) {
  this.x = point.getCoordinates().x;
  this.y = point.getCoordinates().y;
  this.z = point.getCoordinates().z;
}

// helper method
@Transient
public Point getPoint() {
  return new Point( new Coordinates( x, y, z ) );
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42044927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档