带有 Spring JPA 的 H2 中的几何数据类型

Posted

技术标签:

【中文标题】带有 Spring JPA 的 H2 中的几何数据类型【英文标题】:Geometry DataType in H2 w/ Spring JPA 【发布时间】:2017-05-30 12:10:15 【问题描述】:

背景: 在最终迁移到 PostgreSQL 之前,我一直在尝试让几何数据类型与 H2 一起工作。我的代码可以编译,但是当我尝试检索用户模型时,由于几何位置而失败。我得到的列“LOCATION BINARY(255): 'X'aced005....”的值太长了

application.properties

spring.datasource.url=jdbc:h2:file:./members.db
server.port = 8090

gradle.build,主要的依赖是vividsolutions和一些hibernate的。

buildscript 
    ext 
        springBootVersion = '1.5.3.RELEASE'
    
    repositories 
        mavenCentral()
    
    dependencies 
        classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion")
    


apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories 
    mavenCentral()



dependencies 
    testCompile('org.springframework.boot:spring-boot-starter-test')
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile (group: 'com.vividsolutions', name: 'jts', version: '1.13')
    compile (group: 'org.orbisgis', name: 'h2gis', version: '1.3.1')
    compile (group: 'org.hibernate', name: 'hibernate-core', version: '5.2.10.Final')
    compile (group: 'org.hibernate', name: 'hibernate-entitymanager', version: '5.2.10.Final')
    compile (group: 'org.hibernate', name: 'hibernate-spatial', version: '5.2.10.Final')
    runtime('com.h2database:h2')
    //  runtime('org.postgresql:postgresql')

实体:如果我不为应用程序运行的位置提供 getter/setter,但那是因为它实际上并没有尝试访问该数据。我尝试使用其他注释来定义几何位置,@Type(type="org.hibernate.spatial.GeometryType") Hibernate spatial docs。该注释甚至无法编译,因为尽管在 gradle 中有依赖项,但它无法识别 hibernate.spatial。

package com.alex_donley.event_mapper.Entities;


import com.vividsolutions.jts.geom.Geometry;

import javax.persistence.*;

/**
 * Created by Indycorps on 5/11/2017.
 */
@Entity
public class User 

    @Id
    @GeneratedValue
    private long id;

    private String firstName;
    private String lastName;
    @Column(columnDefinition="Geometry")
    private Geometry location;

    public User(String firstName, String lastName, Geometry location) 
        this.firstName = firstName;
        this.lastName = lastName;
        this.location = location;
    

    public User()

    public long getId() 
        return id;
    

    public String getFirstName() 
        return firstName;
    

    public void setFirstName(String firstName) 
        this.firstName = firstName;
    

    public String getLastName() 
        return lastName;
    

    public void setLastName(String lastName) 
        this.lastName = lastName;
    

    //Create getters and setters for location to actually output stuff

    public Geometry getLocation() 
        return location;
    

    public void setLocation(Geometry location) 
        this.location = location;
    

【问题讨论】:

【参考方案1】:

您指的是过时的文档。您的版本的正确文档是here。

Hibernate Spatial 不支持 H2,但它支持基于 H2 的 GeoDB。你可能对那个数据库有更多的运气。

【讨论】:

他们可以解决这个问题,如本文所示:***.com/questions/33607183/…【参考方案2】:

就我而言,只需将hibernate.dialect 更改为org.hibernate.spatial.dialect.h2geodb.GeoDBDialect即可。 (根据 v 5.2 hibernate docs here)

【讨论】:

以上是关于带有 Spring JPA 的 H2 中的几何数据类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 JPA 和 JUnit 测试时如何一致地擦除内存数据库中的 H2 [重复]

如何使用 Spring Boot JPA 在 Postgres 中存储几何点?

如何使用Spring Data JPA在H2数据库中保存数据

内存数据库spring-boot中的h2

SpringBoot+Spring Data JPA整合H2数据库

SpringBoot+Spring Data JPA整合H2数据库