hibernate-spatial-4.0创建bytea列类型而不是几何

时间:2016-01-13 08:23:38

标签: java spring hibernate

我正在使用使用spring 3.1和hibernate 4.2的应用程序。对于空间特征,我们计划使用hibernate空间和postgis。但是hibernate空间创建了具有bytea类型而不是几何的列。我无法找出导致这种情况的根本原因。我花了几天时间才解决但没有成功。

使用hibernate-spatial-4.0.jar。

我正在使用以下hibernate.properties文件

database.driverClassName=org.postgresql.Driver

database.url=jdbc:postgresql://127.0.0.1:5433/mpdb

database.username=postgres

database.password=postgres


hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect

hibernate.show_sql=true

hibernate.hbm2ddl.auto=update

I am using following annotation in Entity

@Column(columnDefinition="Geometry", nullable = true)
    @Type(type = "org.hibernate.spatial.GeometryType")
    private Point geom;

应用程序成功创建了下表,但它不是几何类型,而是为列geom创建bytea

                     Table "public.tile"
       Column           |            Type             | Modifiers

---------------------------- + ------------------ ----------- ----------- +  id |整数|不是空的  alt |双精度|不是空的  geom | bytea |  lat |双精度|不是空的  lng |双精度|不是空的  multipath_table |文字|不是空的  multipath_table_min_value |双精度|  multipath_table_resolution |整数|  multipath_table_tx_id |文字|  tile_created |没有时区的时间戳|不是空的  tile_data_age |整数|  tile_data_present |文字|不是空的  tile_num_tx |整数| 索引:     " tile_pkey" PRIMARY KEY,btree(id)

然而,手动我可以在postgis2.2-postgres9.5数据库中创建几何类型列

我几乎每个线程都经历过但不成功。需要帮助。

2 个答案:

答案 0 :(得分:2)

我可以通过修改Entity类中使用的注释来解决此问题。 这适合我。 @Column(columnDefinition = “几何形状(点,4326)”) private org.hibernate.spatial.GeometryType geom;

答案 1 :(得分:1)

PostgisDialect注册JTS或Geolatte点类型(请参考Hibernate空间documentationsources。 如果是JTS,请确保您使用的是最新版本(org.locationtech.jts),而不是旧版本(com.vividsolutions.jts),方法是更新dependencies并检查您的导入(我有两个,旧的和新的对我的类路径的依赖,并意外导入了错误的一个)。

一个有效的示例(在Kotlin中,但是获取Java导入/批注应该很简单):

我的实体(注意:Point类型完全没有注释!):

import org.locationtech.jts.geom.Point
import java.time.ZonedDateTime
import javax.persistence.*

@Entity
data class TrackPoint(
        @Id @GeneratedValue var id: Long? = null,
        var location : Point,
        var time : ZonedDateTime,
        @ManyToOne
        var track: Track? = null
 )

用于创建TrackPoint的映射功能,然后将其保留:

fun mapWayPoint2TrackPoint(it: WayPoint) : TrackPoint {
    val coordinate = Coordinate(it.longitude.toDouble(), it.latitude.toDouble(), it.elevation.get().toDouble())
    val point = geometryFactory.createPoint(coordinate)
    return TrackPoint(location = point, time = it.time.get())
}    

另外,由于不建议使用PostgisDialect,因此您可以使用一种较新的Postgis方言(如PostgisPG95Dialect)。