3

我正在尝试通过 Hibernate 将 Spring Roo 与启用 PostGIS 的 PostgreSQL 数据库集成,遵循Hibernate Spatial tutorial。所有非 GIS 的东西都工作正常,我已经从 PostGIS 模板创建了一个数据库。

问题是,只要我将 Geometry 属性添加到我的一个实体:

@Type(type="org.hibernate.spatial.GeometryType")
private Point centerPoint;

...它可以构建,但尝试在服务器上运行(并实际与数据库交互)会导致以下错误:

Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: 3000
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:77)
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:100)
    at org.hibernate.dialect.Dialect.getTypeName(Dialect.java:298)
    at org.hibernate.mapping.Column.getSqlType(Column.java:208)
    at org.hibernate.mapping.Table.sqlCreateString(Table.java:418)
    at org.hibernate.cfg.Configuration.generateSchemaCreationScript(Configuration.java:1099)
    at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:106)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:372)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
    ... 41 more

Hibernate Spatial 的依赖项似乎表明 postgis-jdbc 1.5.3 是必需的,但 1.5.3 不存在于任何 Maven 存储库中,我无法从源代码编译它。我试过 1.5.2 和 1.3.3,都导致同样的 3000 错误。HS 说应该“提供” 1.5.3,但是将依赖项设置为 1.5.3<scope>provided</scope>也无济于事。

这仅仅是需要精确版本的 JDBC 的情况,还是有其他问题?

我的POM的相关摘录如下:

        <dependency>
            <groupId>com.vividsolutions</groupId>
            <artifactId>jts</artifactId>
            <version>1.12</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-spatial</artifactId>
            <version>4.0-M1</version>
        </dependency>
        <dependency>
            <groupId>org.postgis</groupId>
            <artifactId>postgis-jdbc</artifactId>
            <version>1.5.2</version>
        </dependency>

persistence.xml

<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisDialect"/>
4

2 回答 2

5

您的异常意味着 Postgresql 方言不支持您通过注释提供的数据类型。使用自定义类对其进行扩展以添加支持可能是解决问题的一种方法。

我看过 GIS 项目,你是否也提供带有编译范围的 javassist 依赖项?

您是否尝试使用以下注释引用您的数据类型?请参阅https://stackoverflow.com/a/3047190/390462

@Column(name = "geometry", columnDefinition="Geometry", nullable = true) 
private Geometry geometry;

据我所知,您需要为columnDefinition您的字段提供一个,否则它将无法将该字段映射到良好的 db 列。

于 2012-08-28T09:29:46.340 回答
0

我找到了解决方案!

(Grails、Hibernate Spatial 4.3、Config.groovy)

hibernate {
    // ...
    dialect = 'org.hibernate.spatial.dialect.postgis.PostgisDialect'
}
于 2015-02-18T13:44:23.103 回答