2016-01-18 41 views
0

我正在將應用程序從Hibernate 3.6.10.Final升級到5.0.7.Final 我現在的主要問題是,在Oracle方言生成足夠快的查詢之前,這樣的:用於Oracle Spatial的Hibernate 5 HQL轉換器

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; 

回答

2

它看起來,設置OGC_STRICT=false確實起作用。這告訴Hibernate使用Oracle自己的空間函數直接使用,而不是使用開放地理空間兼容函數,我們可以在OGC compliance setting文檔中看到。

實際上,我們已經在org.hibernatespatial.oracle.OracleSpatial10gDialect.properties文件中設置了它,但是因爲升級之後它應該以org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect.properties命名,所以它不適用於我們。

相關問題