【问题标题】:Storing geometries as SDO_POINT_TYPE with Hibernate 5 and Oracle使用 Hibernate 5 和 Oracle 将几何存储为 SDO_POINT_TYPE
【发布时间】:2016-03-09 17:23:20
【问题描述】:

我在 Java 应用程序中使用 Hibernate 5.1.0.Final 来实现数据库持久性。这对我们来说会很方便,因为我们希望使用 Oracle 和 Postgres 实例,因此我们可以将此 ORM 作为抽象层。 在former issue when querying geometries using Hibernate-spatial 中,我发布了一些我的配置。
现在的问题是当我们在 Oracle 中保留一些几何字段时。在我的 POJO 中,我有一个导入:

import com.vividsolutions.jts.geom.Geometry;

所以我在我的类中定义了以下属性:

@Column(name = "geom")
protected Geometry geom;

它会被持久化,我可以使用谓词来查询它。但是查看数据库内部我可以看到 geom 字段的内容是:

MDSYS.SDO_GEOMETRY(2001,4326,NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,1,1),MDSYS.SDO_ORDINATE_ARRAY(0.094,51.488))

而不是我想要的,查询速度更快,Oracle 推荐:

MDSYS.SDO_GEOMETRY(2001,4326,MDSYS.SDO_POINT_TYPE(0.094,51.488,NULL),NULL,NULL)

我应该怎么做才能将其存储为点 (SDO_POINT_TYPE) 而不是数组 (SDO_ELEM_INFO_ARRAY) ?

编辑:我尝试更改为Point,如下所示,但据我所知,这并没有什么不同。

import com.vividsolutions.jts.geom.Point;
(...)
@Column(name = "geom")
protected Point geom;

【问题讨论】:

    标签: hibernate-5.x jts hibernate-spatial


    【解决方案1】:

    在我看来,目前没有办法强制 Hibernate 将点存储为点而不是坐标数组。我对此进行了更深入的研究,并对源代码进行了调整,主要是为了我,也为了那些需要这样做的人。

    我为原始项目创建了一个拉取请求。即使它可能会或可能不会被考虑为大师,任何人都可以从这里创建自己的OracleJDBCTypeFactory.java 的自定义版本:

    https://github.com/GeoLatte/geolatte-geom/pull/42

    更新:这已合并到 master。它应该为geolate-geom 的下一个版本做好准备。根据@maesenka 的评论:

    您必须设置系统属性GEOLATTE_USE_SDO_POINT_TYPE=true 才能启用此功能。

    【讨论】:

      猜你喜欢
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      相关资源
      最近更新 更多