Java 如何配置SpringBoot项目以使用inmemory空间数据库进行测试?

Java 如何配置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

这是我现在的配置。我想使用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.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