当前位置: 首页 > 知识库问答 >
问题:

如何将spring boot项目配置为使用inmemory spatial数据库进行测试?

卢俊发
2023-03-14

这是我的配置。我想使用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;
    }

不确定它将与geodb方言或postgis方言一起工作,尽管它似乎非常接近postgis方言。

不管怎样,有人能推荐一些简单的解决方案吗?

共有2个答案

鲜于裕
2023-03-14

为了让其他任何人都能更轻松地完成这一切,Mateusz Stefek answer是正确的方法。以下是确保postgis与hibernate模型和单元测试用例的h2 db配合使用所需的全部内容。下面请注意,hibernate 4不适用,所以最好升级到版本5。请注意,在hibernate 5中,改进的命名策略不再有效。如果您逐渐退出,您可以看看其他stackoverflow解决方案:改进的命名策略在hibernate 5中不再有效

确保您具有以下依赖项

用于Hibernate空间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>

maven依赖项

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-spatial</artifactId>
   <version>5.3.7.Final</version>
</dependency>

<dependency>
   <groupId>org.orbisgis</groupId>
   <artifactId>h2gis-functions</artifactId>
   <version>1.3.0</version>
   <scope>test</scope>
</dependency>

Hibernate JPA模型

import com.vividsolutions.jts.geom.Polygon;

/**
 * setting columnDefintion = "geometry(Polygon,4326)" will not work as h2gis 
 * expects default type geometry not an explicit defintion of the actual type * point 
 * polygon, multipolygon etc
 */
@Column(name = "region_boundary", nullable = false, columnDefinition = "geometry")
private Polygon regionBoundary;

下面确保spring boot可以在调用REST APIendpoint时从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上执行以下内容

你的测试申请。属性文件

flyway.url=jdbc:h2:mem:test;MODE=PostgreSQL;INIT=RUNSCRIPT FROM 'classpath:your_flyway_init.sql'

your_flyway_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();

确保你的测试应用。属性文件hibernate拨号指向GeoDBDialect

spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.h2geodb.GeoDBDialect
华哲茂
2023-03-14

GeoDBDialect与h2gis库的结合在H2中效果良好。我可以存储和加载com。生动的解决方案。jts。geom。多边形没有问题。

我正在使用Hibernate 5.2org。hibernate:hibernate spatial:1.2.4

Hibernate方言:org。冬眠空间的地方话H2B。GeoDBDialect

列类型:几何图形

H2数据库应按照h2gis文档中的说明进行初始化(https://github.com/orbisgis/h2gis)。初始化数据库时,这些应该是第一个sql语句之一。

CREATE ALIAS IF NOT EXISTS H2GIS_SPATIAL FOR "org.h2gis.functions.factory.H2GISFunctions.load";
CALL H2GIS_SPATIAL();

h2gis函数应该在类路径上。)

 类似资料:
  • 我正在用Cucumber编写验收测试,我想使用H2数据库进行测试。 应用程序测试属性如下所示: 在目录resources/db/migration中,我有一个包含这些脚本的sql文件: 但是当我运行测试时,H2用默认格式创建模式,而不是使用脚本: 如您所见,所有VARCHAR都是使用255大小创建的,而不是真实值。 你能帮我把飞行道和H2整合起来吗? 谢谢!

  • nestjs 使用 prisma 如何使用 @nestjs/config 进行配置数据库?

  • 我有一个在mySQL上运行的小型数据库应用程序。 我想使用H2进行测试。 我向build.gradle添加了必要的依赖项: runtimeOnly’com。h2数据库:h2' 然而,我注意到,在完成测试之后,我的mySQL数据库包含测试期间生成的字段,就好像spring没有使用H2一样。 有什么问题吗?

  • 问题内容: 使用嵌入式h2数据源以及JUnit(可选),用于集成测试的Spring配置看起来如何? 我第一次尝试使用SingleConnectionDataSource基本上可以成功,但是在更复杂的测试中失败了,在该测试中您需要同时进行多个连接或暂停事务。我认为基于tcp的服务器模式下的 h2 可能也能正常工作,但这可能不是内存中临时嵌入式数据库最快的通信模式。 有哪些可能性及其优势/劣势?另外,

  • 我正在通过Java代码以编程方式运行JMeter,我希望生成一组具有不同主体的POST请求。下面是我用来生成一个请求的采样器: 如何用CSV文件中的值替换每个请求主体中的? 我知道GUI版本中有插件,但我还没有找到从Java代码中使用它的方法。

  • 我如何配置我的Spring Boot应用程序,以便当我运行单元测试时,它将使用内存中的数据库(如h2/hsql),而当我运行Spring Boot应用程序时,它将使用生产数据库[postgre/mysql]?