Hibernate
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"?><!-- 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"></column> <generator class="assigned"></generator> </id> <property name="point" type="org.hibernatespatial.GeometryUserType"> <column name="POINT_SHARP"></column> </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); }}