Mysql对空间数据库的支持及使用Hibernate Spatial对空间数据的持久化操作

1.空间数据:如果做地图方面的开发,那么对空间数据肯定不会陌生,也就是地图元素即,点,线,图形,它们有x,y坐标的信息

2.MySQL对于空间数据库本身就是支持的,只是支持的不太全面,实际上专业空间数据库非postgis莫属,之所以使用Mysql是因为项目中的数据库已经使用了它,而且对于地图方面的功能并不是很高,所以才有了这样的应该场景:使用MySQL做空间数据库,对于MySQL的空间数据库的操作,参见MySQL使用手册第19章中有详细的说明使用各空间函数的使用sql语句

3.Hibernate Spatial是一个免费开源的对于hibernate支持空间数据操作的扩展框架,版本目前有1.0,1.1,1.1.1,4.0四个版,用法基本相同,

1.1支持hibernate3.5及以下,

1.1.1支持Hibernate3.6;

4.0支持hibernate4.x

对于版本的支持问题,请根据个人的版本而定,必须对应,我在使用中就是吃了版本不对应的亏,使用Hibernate Spatial4.0与hibernate3.6使用,最后报出不支持的异常

异常如下:

4.对于Hibernate Spatial以后的版本,好像以与不会独立的去发行,而是随着Hibernate5会一起存在,也就是可能会在Hibernate5中直接对空间数据的支持.

5.代码部分:(使用hibernate3.6.0+mysql5.5+hibernate spatial1.1.1)

实体类

public class TowerPoint
{
	private String line_id;
	private Point point;
	public String getLine_id()
	{
		return line_id;
	}
	public void setLine_id(String line_id)
	{
		this.line_id = line_id;
	}
	public Point getPoint()
	{
		return point;
	}
	public void setPoint(Point point)
	{
		this.point = point;
	}
}

对应的hbm.xml文件

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Mapping file autogenerated by MyEclipse Persistence Tools -->
<hibernate-mapping>
	<class name="com.tcly.test.TowerPoint" table="om_point">
		<id name="line_id" type="java.lang.String">
			<column name="POINT_ID" length="40" />
			<generator class="assigned"></generator>
		</id>
		<property name="point" type="org.hibernatespatial.GeometryUserType">
			<column name="POINT_SHARP"/>
		</property>
	</class>
</hibernate-mapping>

对应的cfg.xml文件

<!-- 支持空间数据库的MySQL方言 -->
		<property name = "hibernate.dialect">org.hibernatespatial.mysql.MySQLSpatialDialect</property>

进行测试的代码:

hibernate工具类

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class HibernateConnUtil
{
	private static SessionFactory sessionFactory;

	static
	{
		try
		{
			Configuration config = new Configuration().configure();
			sessionFactory = config.buildSessionFactory();
		} catch (Exception ex)
		{
			ex.printStackTrace();
		}
	}

	public static Session openSession()
	{
		Session session = sessionFactory.openSession();
		return session;
	}

	public static void closeSession(Session session)
	{
		if (null != session)
		{
			session.clear();
		}
	}

	public static void closeSessionFactory(SessionFactory sessionFactory)
	{
		if (null != sessionFactory)
		{
			sessionFactory.close();
		}
	}

	public static void commitTransaction(Transaction transaction)
	{
		if (null != transaction)
		{
			transaction.commit();
		}
	}
}

测试代码

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.tcly.eap.core.utils.HibernateConnUtil;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;

public class HibernateCURDTest
{
	public static SessionFactory sessionFactory;
	public static Session session;
	public static Transaction transaction;

	@Before
	public void init()
	{
		session = HibernateConnUtil.openSession();
		transaction = session.beginTransaction();
	}

	@After
	public void destory()
	{
		HibernateConnUtil.commitTransaction(transaction);
		HibernateConnUtil.closeSession(session);
		HibernateConnUtil.closeSessionFactory(sessionFactory);
	}

	@Test
	public void testHibernateMapping() throws ParseException
	{
                TowerPoint towerPoint = new TowerPoint();
		WKTReader formText = new WKTReader();
		Geometry geom = null;

		geom = formText.read("POINT(12.32 23.34)");

		towerPoint.setLine_id("test001");
		towerPoint.setPoint((Point) geom);
		session.save(towerPoint);

	}
}

经过测试,可以保存到数据库中的表中,如果有朋友看到而且在编写过程中有什么问题,可以留言,我一定会回复的

Mysql对空间数据库的支持及使用Hibernate Spatial对空间数据的持久化操作

时间: 2024-10-23 02:53:05

Mysql对空间数据库的支持及使用Hibernate Spatial对空间数据的持久化操作的相关文章

MySql对空间数据库的支持

地址: MySQL5.1中文在线API:http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/spatial-extensions-in-mysql.html

MySQL 全文搜索支持, mysql 5.6.4支持Innodb的全文检索和类memcache的nosql支持

背景:搞个个人博客的全文搜索得用like啥的,现在mysql版本号已经大于5.6.4了也就支持了innodb的全文搜索了,刚查了下目前版本号都到MySQL Community Server 5.6.19 了,所以,一些小的应用可以用它做全文搜索了,像sphinx和Lucene这样偏重的.需要配置或开发的,节省了成本. 这儿有一个原创的Mysql全文搜索的文章, mysql的全文搜索功能:http://blog.csdn.net/bravekingzhang/article/details/672

java实现的MySQL自动备份和还原(struts2+Hibernate)---兼容 window+Linux

相信很多朋友都经历过数据库出问题的情况,我也同样(见我的上一篇博文:phpmyadmin误删表后的恢复过程(心惊胆跳啊)   ).如果数据很大或者很重要,那么恢复起来是相当困难的,所以我们在做一个相对完善的系统时,数据库的备份/还原功能是必不可少的.本文将在javaEE环境下实现MySQL的自动备份/还原,使用了struts2和hibernate框架,MySQL版本是5.1.16. 下图展示的是web application的执行流程, Timer是在一个随着application启动而启动的s

MySQL utf8mb4 字符集:支持 emoji 表情符号

㈠ 序言 为了应对无线互联网的机遇和挑战.避免 emoji 表情符号带来的问题. 涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集 这必须要作为移动互联网行业的一个技术选型的要点 ㈡ 限制 需要 >= MySQL 5.5.3版本.从库也必须是5.5的了.低版本不支持这个字符集.复制报错 ㈢ 简要步骤 以下是一个未升级到 5.5.3 的配置步骤: ① 备份数据库 ② 升级 MySQL Server 到 v5.5.3+ ③ 修改 database.table和column字符

MySql 修改外键 支持级联删除

首先必须要有外键,InnoDB甚么的都不说了,直接上修改句子. ALTER TABLE `t_terminal` DROP FOREIGN KEY `FK704405E7F06A14EF`; ALTER TABLE `t_terminal` ADD CONSTRAINT `FK704405E7F06A14EF` FOREIGN KEY (`userId`) REFERENCES `t_user` (`id`) ON DELETE CASCADE ON UPDATE RESTRICT; 要先删除该

MySQL 5.7新支持--------通用表空间实战

1. 背景 * 一个通用的表空间是一个共享的InnoDB表空间. * 与系统表空间类似,一般的表空间是共享的表空间,可以存储多个表的数据 * 一般的表空间比文件表的表空间具有潜在的内存优势. * MySQL 将表空间元数据保存到一个表空间的生命周期中.在更少的一般表空间中,多个表对表空间元数据的内存比在单独的文件表空间表空间中的相同数量的表要少. * 一般的表空间数据文件可能放在一个相对于MySQL数据目录的目录中,它为您提供了许多文件表空间的数据文件和存储管理功能.与文件表的表空间一样,在My

【无私分享:ASP.NET CORE 项目实战(第十二章)】添加对SqlServer、MySql、Oracle的支持

目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 增加对多数据库的支持,并不是意味着同时对多种数据库操作,当然,后面,我们会尝试同时对多种数据库操作,这可能需要多个上下文,暂且不论.分布式数据库,我们采用的是阿里云的Mycat,这个后面会更新出来.我们今天的场景是:我们的项目可能是在windows上开发的使用的是SqlServer,我们要发布到linux上,SqlServer 2017 据说是支持liunx的,但是还没出... 当然不是说 SqlServer 就不能装在l

[转]mysql在windows下支持表名大小写,lower_case_table_names

windows下mysql默认是不支表名大小写的,也就是表名大小写不敏感.用phpmyadmin创建的驼峰式表名,全部被强制成小写.mysql表名大小写敏感的参数: lower_case_table_names. 在[mysqld]下加上lower_case_table_names=0即可. ### [mysqld] lower_case_table_names=0 ### win下默认值为1,就是说mysql会把表名主动lower. [转]mysql在windows下支持表名大小写,lower

mysql在windows下支持表名大小写,lower_case_table_names

原文:mysql在windows下支持表名大小写,lower_case_table_names windows下mysql默认是不支表名大小写的,也就是表名大小写不敏感. 用phpmyadmin创建的驼峰式表名,全部被强制成小写. mysql表名大小写敏感的参数:lower_case_table_names. Windows2012 下的C:\ProgramData\MySQL\MySQL Server 5.6\my.ini 文件 在[mysqld]下加上lower_case_table_nam