2016-03-09 8 views
1

Я использую Hibernate 5.1.0.Final в приложении Java для сохранения базы данных. Это будет удобно для нас, поскольку мы ожидаем, что ударим экземпляры Oracle и Postgres, поэтому мы можем использовать этот ORM в качестве уровня абстракции. В former issue when querying geometries using Hibernate-spatial Я опубликовал некоторые из моих настроек.
Проблема теперь в том, что мы сохраняем некоторые поля геометрии в Oracle. В моем POJO у меня есть импорт:Сохранение геометрии как SDO_POINT_TYPE с Hibernate 5 и Oracle

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)?

EDIT: Я попытался изменить на 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

Update: Это был слит в мастера. Он должен быть готов к следующей версии geolate-geom. Согласно комментарию @maesenka:

Чтобы включить эту функцию, необходимо установить системное свойство GEOLATTE_USE_SDO_POINT_TYPE=true.