2015-12-16 82 views
2

我在使用H2和GeoDB(內存中,junit)時遇到問題。hibernate-spatial:找不到函數

此外,使用Hibernate 5(最新版本每個軟件包,包括Hibernate空間)和Spring 4

持久存儲和查詢通過ID實體工作得很好。幾何類型被認可沒有問題。出現

問題,當我試圖查詢數據庫與地理空間功能,和Hibernate失敗說,他無法找到函數:

[ERROR] 2015-12-16 11:16:15,000: org.hibernate.engine.jdbc.spi.SqlExceptionHelper.logExceptions:129: Function "ST_CONTAINS" not found; SQL statement: 
select geoentity0_.id as id1_0_, geoentity0_.location as location2_0_, geoentity0_.name as name3_0_ from GEO_ENTITY geoentity0_ where ST_Contains(geoentity0_.location, ?)=1 [90022-190] 

貌似dialect.Here的probem是什麼我使用(在persistence.xml中):

<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.h2geodb.GeoDBDialect" /> 

這些都是我用DEPS:

<dependency> 
    <groupId>com.h2database</groupId> 
    <artifactId>h2</artifactId> 
    <version>1.4.190</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
      <groupId>org.opengeo</groupId> 
      <artifactId>geodb</artifactId> 
      <version>0.7</version> 
      <scope>test</scope> 
</dependency> 

我做錯了什麼,我該如何解決?

編輯:添加h2gis

我試着加入h2gis我DEPS,但並沒有改變錯誤。我也嘗試用h2gis替代geodb,結果相同。

<dependency> 
    <groupId>org.orbisgis</groupId> 
    <artifactId>h2spatial-ext</artifactId> 
    <version>1.2.3</version> 
</dependency> 
+0

也許你還需要[H2GIS]( http://www.h2gis.org/)? –

+0

@ThomasMueller我按照您的建議嘗試過並更新了結果。 –

回答

1

找到解決方案並在此處張貼以留下跟蹤。

這solotion適用於h2 + geodb,但我想,類似的解決方案還可以發現h2gis,有一點耐心。

我所缺少的是一個在名爲import.sql的模式導出中執行的SQL文件,該文件位於在H2層中創建函數的類路徑根中。

這個文件的內容是:

CREATE ALIAS AddGeometryColumn for "geodb.GeoDB.AddGeometryColumn" 
CREATE ALIAS CreateSpatialIndex for "geodb.GeoDB.CreateSpatialIndex" 
CREATE ALIAS DropGeometryColumn for "geodb.GeoDB.DropGeometryColumn" 
CREATE ALIAS DropGeometryColumns for "geodb.GeoDB.DropGeometryColumns" 
CREATE ALIAS DropSpatialIndex for "geodb.GeoDB.DropSpatialIndex" 
CREATE ALIAS EnvelopeAsText for "geodb.GeoDB.EnvelopeAsText" 
CREATE ALIAS GeometryType for "geodb.GeoDB.GeometryType" 
CREATE ALIAS ST_Area FOR "geodb.GeoDB.ST_Area" 
CREATE ALIAS ST_AsEWKB FOR "geodb.GeoDB.ST_AsEWKB" 
CREATE ALIAS ST_AsEWKT FOR "geodb.GeoDB.ST_AsEWKT" 
CREATE ALIAS ST_AsHexEWKB FOR "geodb.GeoDB.ST_AsHexEWKB" 
CREATE ALIAS ST_AsText FOR "geodb.GeoDB.ST_AsText" 
CREATE ALIAS ST_BBOX FOR "geodb.GeoDB.ST_BBox" 
CREATE ALIAS ST_Buffer FOR "geodb.GeoDB.ST_Buffer" 
CREATE ALIAS ST_Centroid FOR "geodb.GeoDB.ST_Centroid" 
CREATE ALIAS ST_Crosses FOR "geodb.GeoDB.ST_Crosses" 
CREATE ALIAS ST_Contains FOR "geodb.GeoDB.ST_Contains" 
CREATE ALIAS ST_DWithin FOR "geodb.GeoDB.ST_DWithin" 
CREATE ALIAS ST_Disjoint FOR "geodb.GeoDB.ST_Disjoint" 
CREATE ALIAS ST_Distance FOR "geodb.GeoDB.ST_Distance" 
CREATE ALIAS ST_Envelope FOR "geodb.GeoDB.ST_Envelope" 
CREATE ALIAS ST_Equals FOR "geodb.GeoDB.ST_Equals" 
CREATE ALIAS ST_GeoHash FOR "geodb.GeoDB.ST_GeoHash" 
CREATE ALIAS ST_GeomFromEWKB FOR "geodb.GeoDB.ST_GeomFromEWKB" 
CREATE ALIAS ST_GeomFromEWKT FOR "geodb.GeoDB.ST_GeomFromEWKT" 
CREATE ALIAS ST_GeomFromText FOR "geodb.GeoDB.ST_GeomFromText" 
CREATE ALIAS ST_GeomFromWKB FOR "geodb.GeoDB.ST_GeomFromWKB" 
CREATE ALIAS ST_Intersects FOR "geodb.GeoDB.ST_Intersects" 
CREATE ALIAS ST_IsEmpty FOR "geodb.GeoDB.ST_IsEmpty" 
CREATE ALIAS ST_IsSimple FOR "geodb.GeoDB.ST_IsSimple" 
CREATE ALIAS ST_IsValid FOR "geodb.GeoDB.ST_IsValid" 
CREATE ALIAS ST_MakePoint FOR "geodb.GeoDB.ST_MakePoint" 
CREATE ALIAS ST_MakeBox2D FOR "geodb.GeoDB.ST_MakeBox2D" 
CREATE ALIAS ST_Overlaps FOR "geodb.GeoDB.ST_Overlaps" 
CREATE ALIAS ST_SRID FOR "geodb.GeoDB.ST_SRID" 
CREATE ALIAS ST_SetSRID FOR "geodb.GeoDB.ST_SetSRID" 
CREATE ALIAS ST_Simplify FOR "geodb.GeoDB.ST_Simplify" 
CREATE ALIAS ST_Touches FOR "geodb.GeoDB.ST_Touches" 
CREATE ALIAS ST_Within FOR "geodb.GeoDB.ST_Within" 
CREATE ALIAS Version FOR "geodb.GeoDB.Version" 
0

添加org.opengeo:geodbcom.h2database:h2依賴,然後運行在啓動時GeoDB.InitGeoDB(dataSource.getConnection())

org.hibernate.spatial.dialect.h2geodb.GeoDBDialect對於hibernate.dialect是好的。

搖籃:

testCompile('com.h2database:h2:1.4.196') 
testCompile('org.opengeo:geodb:0.8') 

舉例彈簧(可以美化代碼,如果你想不創建不必要的一個布爾型Bean):

@Bean 
public boolean initGeoDB(final DataSource dataSource) throws SQLException { 
    final Connection cx = dataSource.getConnection(); 
    GeoDB.InitGeoDB(cx); 
    return true; 
}