我正在使用使用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数据库中创建几何类型列
我几乎每个线程都经历过但不成功。需要帮助。
答案 0 :(得分:2)
我可以通过修改Entity类中使用的注释来解决此问题。 这适合我。 @Column(columnDefinition = “几何形状(点,4326)”) private org.hibernate.spatial.GeometryType geom;
答案 1 :(得分:1)
PostgisDialect注册JTS或Geolatte点类型(请参考Hibernate空间documentation和sources。 如果是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)。