这是我的配置。我想使用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方言。
不管怎样,有人能推荐一些简单的解决方案吗?
为了让其他任何人都能更轻松地完成这一切,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
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]?