Hibernate Spatial:“JDBC类型的无方言映射:3000”

时间:2012-08-28 09:14:05

标签: hibernate maven jdbc dependencies postgis

我正在尝试通过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's dependencies似乎暗示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"/>

2 个答案:

答案 0 :(得分:5)

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

我看看GIS项目,你是否也提供了javassist依赖与编译范围?

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

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

根据我的理解,您需要为您的字段提供columnDefinition,否则无法将字段映射到良好的数据库列。

答案 1 :(得分:0)

我找到了解决方案!

(Grails,Hibernate Spatial 4.3,Config.groovy)

hibernate {
    // ...
    dialect = 'org.hibernate.spatial.dialect.postgis.PostgisDialect'
}