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;
}
}<?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>
<!-- 支持空间数据库的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对空间数据的持久化操作,布布扣,bubuko.com
Mysql对空间数据库的支持及使用Hibernate Spatial对空间数据的持久化操作
原文:http://blog.csdn.net/tssxs/article/details/27192499