映射到com.vividsolutions.jts.geom.Point无效的endian标志

时间:2017-02-04 19:56:45

标签: java spring hibernate postgis spatial

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

我正在使用暴露给客户端的模型并将其映射如下:

 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:

createPoint(user.getLocation().getLongitude(), user.getLocation().getLatitude());

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

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

    <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配置:

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

列定义:

@Column(name="point")
private com.vividsolutions.jts.geom.Point point;

关于如何修复此错误的任何想法? 提前谢谢你们。

1 个答案:

答案 0 :(得分:1)

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

正如评论中所指出的,您可以使用AttributeConverter实施来存储x的{​​{1}},yz个组成部分由一些魔术字符分隔的单个列中的坐标:

Point

这种方法的一个固有问题是,它使查询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并提供构成{{1}的各种Pointxy值那么坐标,你最好考虑一下:

  • 自定义z实施
  • 使用Point代表持久性世界中的UserType

对于自定义@Embeddable,您需要定义一个新类型,在此示例中可能称为Point,扩展为UserType,并按以下方式引用它:

PointType

自定义UserType会将点的坐标的@Type(type = "PointType") @Columns({@Column(name = "X"), @Column(name="Y"), @Column(name="Z")) private Point point; UserTypex部分映射到相应的列y,{{1 }和z,反之亦然。

对于X解决方案,您只需创建自己的Y课程,您可以在其中传递几何Z课程,以便阅读@Embeddable,{ {1}}和JpaPoint值并将这些值存储在持久性模型的3个属性中。然后,Point类还可以公开一个帮助方法,允许调用者从x embeddable生成y

z