使用Hibernate 5和Oracle将几何存储为SDO_POINT_TYPE

时间:2016-03-09 17:23:21

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

我在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;

1 个答案:

答案 0 :(得分:1)

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

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

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

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

  

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