есть таблица, содержащая столбец типа SDO_GEOMETRY
, представляющий несколько точек. Позже должен быть выполнен пространственный запрос типа «показать все остальные точки на расстоянии x». После загрузки некоторых данных через sqlloader
в таблицу импорта я собираюсь перенести эти наборы данных в базовую таблицу при объединении, если бизнес-ключ все еще существует.
Мое приложение представляет собой исполняемый файл jar, использующий базу данных hibernate 5.0.9
, hibernate-spatial 5.0.9 final
, Oracle12c, а hibernate.dialect был
org.hibernate.dialect.Oracle12cDialect
раньше, но теперь изменился на
org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect
Я знаю, что официально существует только пространственный диалект для Oracle10, а также тест с oracle11, но с oracle12.
Теперь проблема в том, что объекты сохраняются через спящий режим в базовую таблицу, но внутри SDO-Geometry все координаты равны нулю (в то время как объект sdo_geometry - нет).
select
businessKey,
my_sdo_geometry.sdo_point.x longitude,
my_sdo_geometry.sdo_point.y latitude
from my_import_table;
После sqlloader все координаты в таблице импорта отображаются хорошо.
Но после обработки каждого набора данных импорта его столбец «импортированный» {Y, N} устанавливается в «Y». И для этого я использую myEntityManager.merge(importDataset)
. Из-за этого (хотя все координаты были в порядке после sqlloader) координаты набора данных импорта очищаются до нуля.
//coordinates still viewable in database
importObject.setImported(Boolean.TRUE);
em.merge(importObject);
//coordinates null now
Я предполагаю, что пространственный диалект не работает должным образом. Я боюсь, что это происходит из-за некоторой несовместимости между последней версией hibernate-spatial и oracle12c.
Я пишу здесь с надеждой, что есть кто-нибудь, кто успешно использует hibernate-spatial с oracle12 (чтобы уточнить, что это вообще возможно) и может получить некоторую помощь с любой плохой конфигурацией на моей стороне.
Постоянство.xml моего приложения:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="myUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml" />
<property name="use_sql_comments" value="true" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver" />
<property name="hibernate.connection.url" value="jdbc:oracle:thin:@123.456.789.1:1234/cm" />
<property name="hibernate.connection.username" value="testMe" />
<property name="hibernate.connection.password" value="********" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect" />
</properties>
</persistence-unit> </persistence>
Заранее спасибо.
изменить: в классе сущностей столбец sdo_geometry (здесь называемый «Позиция») геттер аннотируется следующим образом:
@Column(name = "POSITION", nullable = false)
public Point getPosition() {
return this.position;
}
изменить 2: после включения трассировки спящего режима sql я обнаружил, что спящий режим пытается это обновление:
Hibernate: update IMPORT_TABLE set HB_VERSION=?, BUSINESS_KEY=?, IMPORTED=?, [...], POSITION=? where IMPORT_TABLE_ID=? and HB_VERSION=?
Я указываю на POSITION=?
, что не может быть правильным, я считаю. В этой позиции я ожидаю, что спящий диалект будет иметь место. Еще один намек на несовместимость с спящим диалектом, пространственным10 и оракулом12.