我正在尝试使用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。更重要的是,使用休眠方式将点存储在数据库中的正确方法是什么。没有适当的示例可以实现相同的功能。我刚冬眠,无法解决这个问题。
答案 0 :(得分:0)
您应该使用“ org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect”或“ org.hibernate.spatial.dialect.mysql.MySQL8SpatialDialect”,而不是“ org.hibernate.dialect.MySQLDialect”。
检查您的mysql服务器版本,它应该是mysql 5.7或更高版本,或者最好使用mysql8。