Транслятор Hibernate 5 HQL для Oracle Spatial

Я обновляю приложение с Hibernate 3.6.10.Final до 5.0.7.Final. Основная проблема, с которой я столкнулся сейчас, заключается в том, что раньше диалект Oracle генерировал достаточно быстрый запрос, подобный этому:

SELECT * FROM MY_TABLE 
WHERE SDO_RELATE(geom,SDO_GEOMETRY(?,4326),'mask=INSIDE+COVEREDBY') ='TRUE'

Теперь он будет генерировать что-то ужасно медленное:

SELECT * FROM MY_TABLE 
WHERE MDSYS.OGC_WITHIN(MDSYS.ST_GEOMETRY.FROM_SDO_GEOM(geom),MDSYS.ST_GEOMETRY.FROM_SDO_GEOM(?))=1 

Этот не завершится вовремя и увеличит тайм-аут транзакции:

JTA transaction unexpectedly rolled back (maybe due to a timeout

Я могу только думать, что что-то не так с любым классом диалекта, который он использует для перевода HQL в надлежащий производительный пространственный SQL Oracle.

Моя конфигурация выглядит следующим образом.

пом.xml:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.0.7.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.0.7.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-spatial</artifactId>
        <version>5.0.7.Final</version>
    </dependency>

Мой файл persistence.xml, в котором я настраиваю Atomikos (4.0.0M4) в качестве менеджера транзакций.

<persistence-unit name="pers_unit_name" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jta_data_source_name</jta-data-source>
<mapping-file>oracle.hbm.xml</mapping-file>
<class>...</class>
<properties>
        <property name="hibernate.dialect" value="org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect" />
        <property name="hibernate.spatial.dialect" value="org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect" />
        <property name="hibernate.spatial.connection_finder" value="org.geolatte.geom.codec.db.oracle.DefaultConnectionFinder" />
        <property name="hibernate.connection.autocommit" value="false" />
        <property name="hibernate.transaction.manager_lookup_class" value="com.atomikos.icatch.jta.hibernate4.TransactionManagerLookup" />
         <property name="transaction.factory_class"
            value="org.hibernate.transaction.JTATransactionFactory" />          
        <property name="hibernate.transaction.jta.platform" value="com.atomikos.icatch.jta.hibernate4.AtomikosPlatform"/> 
        <property name="hibernate.transaction.coordinator_class" value="jta"/>
        <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
    </properties>
</persistence-unit>

Когда я отлаживаю HQLQueryPlan, я вижу транслятор запросов, который он использует внутри:

org.hibernate.hql.internal.ast.QueryTranslatorImpl

Не уверен, правильно это или неправильно, или как это можно настроить для создания правильного запроса.

Это приложение работает на Tomcat 8.

POJO, используемый с Hibernate для сопоставления объекта, содержит этот атрибут geom, который определяется как:

@Column(name = "geom", columnDefinition="Geometry", nullable = true)
protected Geometry geom;

person krause    schedule 18.01.2016    source источник


Ответы (1)


Похоже, что настройка OGC_STRICT=false помогла. Это говорит Hibernate использовать собственные пространственные функции Oracle, которые используются напрямую, вместо использования функций, совместимых с Open Geospatial, как мы можем прочитать в Настройка соответствия OGC.

На самом деле, мы уже настроили его в файле org.hibernatespatial.oracle.OracleSpatial10gDialect.properties, но так как после обновления он должен называться после org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect.properties, он у нас не сработает.

person krause    schedule 19.01.2016