2016-03-09 41 views
1

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

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

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

我创建了对原始项目的拉取请求。尽管它可能会或可能不会考虑主,任何人都可以潜在地产生的OracleJDBCTypeFactory.java自己定制的版本从这里把它:

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

更新:这是合并到主。它应该准备好用于geolate-geom的下一个版本。根据@maesenka的评论:

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

相关问题