无法从发送到GEOMETRY字段的数据获取几何对象:Hibernate Spatial + Mysql

时间:2019-07-10 19:40:26

标签: java mysql hibernate geometry hibernate-spatial

我正在尝试使用Mysql中的Hibernate保存Point数据。但是我不明白我在做什么错?

我正在使用hibernate 5.3.6,jts 1.14,mysql-connector-5.1.18。 数据库具有三个字段id,name和curr_loc,分别为int,varchar和point类型

我使用的休眠方言是org.hibernate.dialect.MySQLDialect。

这是实体类

import com.vividsolutions.jts.geom.Point;

@Entity
@Table(name = "location")
public class Location {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private String name;

    @Column(name = "curr_loc")
    private Point curr_loc;

//getters and setters
}

这是SaveLocation类的主要方法中的代码,该方法使用休眠模式存储数据

public static void main(String args[]){

     SessionFactory factory = new Configuration()        
                                .configure("hibernate.cfg.xml")
                                .addAnnotatedClass(Location.class)
                                .buildSessionFactory();
     Session session = factory.getCurrentSession();

     GeometryFactory geometryFactory = new GeometryFactory();
     Point point = geometryFactory.createPoint( new Coordinate( 10, 5 ) );
     Location tempLocation = new Location("AMD", point);
     session.beginTransaction();
     session.save(tempLocation);
     session.getTransaction().commit();
}

当我尝试使用 MySQLSpatial56Dialect 时,它给了我这个错误: 无法获得与查询元数据的连接:无法将名称[org.hibernate.dialect.MySQLSpatial56Dialect]解析为策略[org.hibernate.dialect.Dialect] 线程“主”中的异常org.hibernate.service.spi.ServiceException:无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

如果我将方言保留为 MySQLDialect ,然后尝试保存数据,则会出现以下错误: 错误:数据被截断:无法从发送到GEOMETRY字段的数据中获取几何对象 造成原因:com.mysql.jdbc.MysqlDataTruncation:数据截断:无法从发送到GEOMETRY字段的数据中获取几何对象

请提出我在做什么错?为什么我不能使用MySQLSpatial56Dialect。更重要的是,使用休眠方式将点存储在数据库中的正确方法是什么。没有适当的示例可以实现相同的功能。我刚冬眠,无法解决这个问题。

1 个答案:

答案 0 :(得分:0)

您应该使用“ org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect”或“ org.hibernate.spatial.dialect.mysql.MySQL8SpatialDialect”,而不是“ org.hibernate.dialect.MySQLDialect”。

检查您的mysql服务器版本,它应该是mysql 5.7或更高版本,或者最好使用mysql8。