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对空间数据的持久化操作,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。