我正在尝试通过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"/>
答案 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'
}