【问题标题】:Hibernate 5 HQL translator for Oracle Spatial用于 Oracle Spatial 的 Hibernate 5 HQL 转换器
【发布时间】:2016-01-18 18:41:33
【问题描述】:

我正在将应用程序从 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 转换为适当的性能 Oracle 空间 SQL 的任何方言类都有问题。

我的配置如下。

pom.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 上运行。

与 Hibernate 一起使用来映射实体的 POJO 包含定义为的 geom 属性:

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

【问题讨论】:

    标签: oracle hibernate jta oracle-spatial


    【解决方案1】:

    看起来设置OGC_STRICT=false 可以解决问题。这告诉 Hibernate 直接使用 Oracle 自己的空间函数,而不是使用 Open Geospatial 兼容函数,正如我们可以在 OGC compliance setting 文档中看到的那样。

    其实我们已经在org.hibernatespatial.oracle.OracleSpatial10gDialect.properties文件中设置好了,但是因为升级后应该以org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect.properties命名,所以对我们不起作用。

    【讨论】:

      猜你喜欢
      • 2015-10-05
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 2012-08-23
      • 2017-01-06
      相关资源
      最近更新 更多