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对空间数据的持久化操作