2015-12-16 26 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; 
}