【问题标题】:Hibernate Spatial: "No Dialect mapping for JDBC type: 3000"Hibernate Spatial:“JDBC 类型没有方言映射:3000”
【发布时间】:2012-08-22 18:37:51
【问题描述】:

我正在尝试通过 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 和 &lt;scope&gt;provided&lt;/scope&gt; 也无济于事。

这仅仅是需要精确版本的 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"/>

【问题讨论】:

    标签: hibernate maven jdbc dependencies postgis


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 关于方言,我忘了说默认PostgreSQLDialect和正确的org.hibernate.spatial.dialect.postgis.PostgisDialect有同样的问题,所以就是这样。我没有添加 javassist 依赖项,因为它应该被传递包含。不幸的是,手动将依赖项添加到 POM 没有任何区别 :(。我在 hibernatespatial.org/tutorial-hs4.html 上遵循教程并做了所有这些事情,所以我希望在没有任何自定义类的情况下逃脱。
    • 看看这些教程。看来您正在使用 lib hibernate-spatial 的 Milestone 版本和较低版本的 postgis-jdbc 包:尝试使用 1.5.3。有时它会变得神奇。
    • 叹息。所以我终于设法让 PostGIS JDBC 1.5.3 使用 Ant 进行编译,并将它复制到相应的 Maven 存储库目录中,并将我的 POM postgis-jdbc 版本更新为 1.5.3,你瞧,它没有抱怨!它捡起它,并在 Maven Dependencies 库中列出了它。但是我仍然得到完全相同的错误。
    • 好吧,也许 Pascal Thivent 的 these answer 会帮助你。
    • 你知道吗,这可能刚刚奏效!我已经看到了这个问题,但似乎直接恢复到 Hibernate 注释正在从 Roo 解决方案转移。我会做几个测试来确认,但非常感谢您的指点。
    【解决方案2】:

    我找到了解决办法!

    (Grails、Hibernate Spatial 4.3、Config.groovy)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 2015-03-27
      • 2014-03-05
      相关资源
      最近更新 更多