F1V3.0-图形-使用hibernate spatial 5对空间几何字段的映射
目录
由于F13.0使用Hibernate 5所以对应的Hibernate Spatial也要升级到5.x版本,在官网发现5.x版本已经被嵌入到Hibernate框架中,不在由Hibernate Spatial官方维护了。
一 简介
-
Hibernate Spatial是Hibernate处理地理数据的通用扩展。 Hibernate Spatial是根据LGPL许可证开源和许可的,如Hibernate。
-
Hibernate Spatial允许您以标准化方式处理地理数据。 它从数据库支持地理数据的具体方式抽象出来,并为地理数据存储和查询功能提供了一个标准化的跨数据库接口。
-
Hibernate Spatial支持OGC简单功能规范的大部分功能。 支持的数据库有:Oracle 10g / 11g,Postgresql / Postgis,MySQL,Microsoft SQL Server和H2 / GeoDB。
-
Hibernate Spatial官方网站包含旧版本(1.x和4.x)的文档及下载包。 5.x及更高版本的文档将很快在Hibernate ORM官方网站上提供,从5.x开始已经被嵌入到hibernate框架中使用,成为其中一个模块。
二 引入依赖
将如下代码添加到pom.xml文件,添加到依赖(dependencys)节点内
<!-- hibernate spatial 5 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-spatial</artifactId>
<version>5.0.8.Final</version>
</dependency>
目前只能从中央仓库下载到5.0.8.Final版本,其它版本没找到,下载会失败。
三 修改数据库方言
数据库默认方言是不支持spatial的,需要修改成spatial扩展的方言才能使用。
打开application.properties配置文件,这里以mysql作为列子,添加如下配置:
#使用spatial/GIS方言
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQLSpatialDialect
- 附:方言列表
数据库类型 | 方言 |
---|---|
Postgis | org.hibernate.spatial.dialect.postgis.PostgisDialect |
H2 | org.hibernate.dialect.H2Dialect |
GeoDb (H2 spatial extension) | org.hibernate.spatial.dialect.h2geodb.GeoDBDialect |
Oracle 11g | org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect |
MS SQL Server dialect | org.hibernate.spatial.dialect.sqlserver.SqlServer2008SpatialDialect |
MySQL 5 dialects | org.hibernate.spatial.dialect.mysql.MySQLSpatialDialect |
MySQL 5 InnoDDB dialect | org.hibernate.spatial.dialect.mysql.MySQLSpatial5InnoDBDialect |
MySQL 5.6.1 dialect | org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect |
四 模型注释
对数据库中对应的地理几何字段添加注释,注意spatial没有使用二级缓存,所以不能添加@Cache二级缓存注释,否侧微服务启动时会报错,代码如下:
@Column(name = "GRAPHGEOMETRY", nullable = false)
private Geometry graphGeometry;
再贴上一个完整的模型代码:
/**
* @Package: com.jb.gis.model<br>
* @ClassName: TbGraph<br>
* @Description: TGraph 图形实体对象<br>
*/
@Entity
@Table(name = "tb_gis_graph", catalog = "us_gis")
public class TbGraph extends PersistClass implements java.io.Serializable {
private static final long serialVersionUID = 7123148713399645659L;
/** 主键标示 */
@GenericGenerator(name = "generator", strategy = "assigned")
@Id
@GeneratedValue(generator = "generator")
@Column(name = "ID", unique = true, nullable = false, length = 48)
private String Id;
/** 图形id */
@Column(name = "GraphID", unique = true, nullable = false, length = 48)
private String graphId;
/** 图形名称 */
@Column(name = "GRAPHNAME", length = 150, nullable = true)
private String graphName;
/** 图形对应的图元符号id */
@Column(name = "GRAPHTYPE", length = 50, nullable = true)
private String graphType;
/** 图形所属图层id */
@Column(name = "LayerID", length = 100, nullable = false)
private String layerId;
/** 图形渲染样式 */
@Column(name = "Style", length = 500, nullable = true)
private String style;
/** 额外字段,现主要存储连接关系 */
@Column(name = "Extra", length = 300, nullable = true)
private String extra;
@Column(name = "APPLICABLEFIELD", length = 500, nullable = true)
private String applicableField;
/** 几何图形 */
//@Type(type="org.hibernate.spatial.JTSGeometryType")
@Column(name = "GRAPHGEOMETRY", nullable = false)
private Geometry graphGeometry;
/** 规划状态 */
@Column(name = "PLANNINGSTATE", length = 500, nullable = true)
private String planningState;
/** 关联图层id */
@Column(name = "RELATEDLAYERID", length = 500, nullable = true)
private String relatedLayerId;
/** 关联图形字段 */
@Column(name = "RELATEDGRAPHID", length = 500, nullable = true)
private String relatedGraphId;
/** 关联站内图图层id */
@Column(name = "STATIONLAYERID", length = 500, nullable = true)
private String stationLayerID;
public String getId() {
return Id;
}
public void setId(String Id) {
this.Id = Id;
}
public String getGraphId() {
return graphId;
}
public void setGraphId(String graphId) {
this.graphId = graphId;
}
public String getGraphName() {
return graphName;
}
public void setGraphName(String graphName) {
this.graphName = graphName;
}
public String getGraphType() {
return graphType;
}
public void setGraphType(String graphType) {
this.graphType = graphType;
}
public String getLayerId() {
return layerId;
}
public void setLayerId(String layerId) {
this.layerId = layerId;
}
public String getStyle() {
return style;
}
public void setStyle(String style) {
this.style = style;
}
public String getExtra() {
return extra;
}
public void setExtra(String extra) {
this.extra = extra;
}
public String getApplicableField() {
return applicableField;
}
public void setApplicableField(String applicableField) {
this.applicableField = applicableField;
}
public Geometry getGraphGeometry() {
return graphGeometry;
}
public void setGraphGeometry(Geometry graphGeometry) {
this.graphGeometry = graphGeometry;
}
public String getPlanningState() {
return planningState;
}
public void setPlanningState(String planningState) {
this.planningState = planningState;
}
public String getRelatedLayerId() {
return relatedLayerId;
}
public void setRelatedLayerId(String relatedLayerId) {
this.relatedLayerId = relatedLayerId;
}
public String getRelatedGraphId() {
return relatedGraphId;
}
public void setRelatedGraphId(String relatedGraphId) {
this.relatedGraphId = relatedGraphId;
}
public String getStationLayerID() {
return stationLayerID;
}
public void setStationLayerID(String stationLayerID) {
this.stationLayerID = stationLayerID;
}
}
至此hibernate spatial 5配置完成,还是比较简单的,但是如果在f13.0中使用hibernate spatial 1.x就比较麻烦,后面文章会介绍1.x版本的配置。
转载自:https://blog.csdn.net/ZHBR_F1/article/details/74240875