Java 如何配置SpringBoot项目以使用inmemory空间数据库进行测试?
这是我现在的配置。我想使用hibernate spatial在生产中使用postgisJava 如何配置SpringBoot项目以使用inmemory空间数据库进行测试?,java,spring,h2,hibernate-spatial,Java,Spring,H2,Hibernate Spatial,这是我现在的配置。我想使用hibernate spatial在生产中使用postgis spring: profiles: production datasource: platform: postgres url: jdbc:postgresql://192.168.99.100:5432/dragon username: dragon password: dragon database: driverClassName: org.pos
spring:
profiles: production
datasource:
platform: postgres
url: jdbc:postgresql://192.168.99.100:5432/dragon
username: dragon
password: dragon
database:
driverClassName: org.postgresql.Driver
jpa:
database: POSTGRESQL
database-platform: org.hibernate.spatial.dialect.postgis.PostgisDialect
show-sql: true
hibernate:
ddl-auto: update
---
spring:
profiles: development
datasource: SpatialInMemoryDb
jpa:
database-platform: org.hibernate.spatial.dialect.h2geodb.GeoDBDialect
hibernate:
ddl-auto: create-drop
对于测试,所有发现都是h2gis项目
public class SpatialInMemoryDb extends SingleConnectionDataSource{
public SpatialInMemoryDb() {
setDriverClassName("org.h2.Driver");
setUrl("jdbc:g2:mem:test");
setSuppressClose(true);
}
@Override
public Connection getConnection() throws SQLException {
System.out.println("************");
Connection connection = super.getConnection();
try (Statement st = connection.createStatement()) {
// Import spatial functions, domains and drivers
// If you are using a file database, you have to do only that once.
CreateSpatialExtension.initSpatialExtension(connection);
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
不确定它是否能与geodbdialect或postgisdialect一起使用,尽管它似乎非常接近postgisdialect
总之,有人能推荐一些简单的解决方案吗?将GeoDBDialect与h2gis库相结合在H2中效果很好。我可以毫无问题地存储和加载
com.livitSolutions.jts.geom.Polygon
我正在使用Hibernate 5.2+org.Hibernate:Hibernate spatial:1.2.4
Hibernate方言:org.Hibernate.spatial.dial.h2geodb.GeoDBDialect
列类型:几何图形
H2数据库应按照h2gis文档()中的说明进行初始化。这些应该是初始化数据库时的第一个sql之一
CREATE ALIAS IF NOT EXISTS H2GIS_SPATIAL FOR "org.h2gis.functions.factory.H2GISFunctions.load";
CALL H2GIS_SPATIAL();
(
H2GISFunctions
应该在类路径上。)只是为了让其他任何试图让所有这些都发挥作用的人更容易一些@Mateusz Stefek answer是正确的方法。以下是确保postgis与hibernate模型和h2 db配合使用以进行单元测试用例所需的全部内容。请注意,下面的说明不适用于hibernate 4,因此最好升级到版本5。请注意,在hibernate 5中,改进的命名策略不再有效。如果您逐渐退出,您可以看看其他stackoverflow解决方案:
确保您具有以下依赖项
hibernate spatial+h2gis的maven repos
<repository>
<id>OSGEO GeoTools repo</id>
<url>http://download.osgeo.org/webdav/geotools</url>
</repository>
<repository>
<id>Hibernate Spatial repo</id>
<url>http://www.hibernatespatial.org/repository</url>
</repository>
下面确保了当我们调用RESTAPI端点时,spring boot可以从postgres序列化我们的postgis几何数据
import com.bedatadriven.jackson.datatype.jts.JtsModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JacksonConfig {
@Bean
public JtsModule jtsModule() {
return new JtsModule();
}
}
如果您使用flyway,您可以使它在测试脚本中运行,以确保在h2 db上执行以下内容
您的test application.properties文件
flyway.url=jdbc:h2:mem:test;MODE=PostgreSQL;INIT=RUNSCRIPT FROM 'classpath:your_flyway_init.sql'
您的\u flyway\u init.sql脚本的内容
CREATE SCHEMA IF NOT EXISTS "{your_schema_if_applicable}";
CREATE ALIAS IF NOT EXISTS H2GIS_SPATIAL FOR "org.h2gis.functions.factory.H2GISFunctions.load";
CALL H2GIS_SPATIAL();
确保您的test application.properties文件hibernate拨号指向GeoDBDialect
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.h2geodb.GeoDBDialect
您好,H2GIS当前不支持hibernate。Geodb是旧版本h2的另一个空间扩展。那么对于你的东西,你应该用GeoDB。是的,我有关于GeoDB的想法。它的一个问题是,我找不到任何地方可以用作它的maven依赖项。你应该试试geodb的mailinglist,我可以确认这也适用于Hibernate 5.0.12(它包含在Spring Boot 1.5.10中)使用Hibernate Spatial 5.0.12以及
org.orbisgis:h2gis ext:1.3.2
这对我有帮助,因为我不得不停止使用org.opengeo:geodb
,因为repo.boundlessgis.com
不再工作了,所以这帮助我切换到org.orbisgis:h2gis
谢谢你–这与实践证明非常有用。令人惊讶的是,外面的信息似乎如此之少。
CREATE SCHEMA IF NOT EXISTS "{your_schema_if_applicable}";
CREATE ALIAS IF NOT EXISTS H2GIS_SPATIAL FOR "org.h2gis.functions.factory.H2GISFunctions.load";
CALL H2GIS_SPATIAL();
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.h2geodb.GeoDBDialect