我有一个类(pointareamodel),它封装了一些地理信息,我想在Hibernate5.2Spatial的jpa实体和postgis的postgres中使用它作为属性。为了保持代码中其他地方使用的相同逻辑,我想使用attributeconverter(pointareamodelconverter)保存类的geometry属性。
@Converter(autoApply = true)
public class PointAreaModelConverter implements AttributeConverter<PointAreaModel, Point> {
public PointAreaModelConverter() {
}
@Override
public Point convertToDatabaseColumn(PointAreaModel attribute) {
return (attribute != null) ? (Point)(attribute.getAreaGeometry()) : null;
}
@Override
public PointAreaModel convertToEntityAttribute(Point dbData) {
return (dbData != null) ? new PointAreaModel(dbData.getX(),dbData.getY()) : null;
}
}
我的实体有以下字段:
private PointAreaModel targetCenteredPoint;
课程是:
public class PointAreaModel implements AreaModel {
private static final long serialVersionUID = 1L;
private static final AreaType areaType = AreaType.POINT;
private LatLonPoint areaDefinition;
private Geometry areaGeometry;
/**Constructors */
public PointAreaModel() {}
public PointAreaModel(double lat, double lon) throws IllegalArgumentException {
this.areaDefinition = new LatLonPoint(lat, lon);
this.setAreaGeometry();
}
/***/
/**Getters and setters */
@Override
public AreaType getAreaType() {
return areaType;
}
@Override
public LatLonPoint getAreaDefinition() {
return areaDefinition;
}
@Override
public void setAreaDefinition (Serializable areaDefinition) {
this.areaDefinition = (LatLonPoint) areaDefinition;
this.setAreaGeometry();
}
@Override
public Geometry getAreaGeometry() {
return areaGeometry;
}
private void setAreaGeometry () {
GeometryFactory gf=new GeometryFactory();
areaGeometry=gf.createPoint(areaDefinition.getLonLatCoordinate());
areaGeometry.setSRID(4326);
}
}
但是它失败了,错误是:由:org.hibernate.mappingexception:没有jdbc类型的方言Map:1178270318
如果在控制台日志中搜索此代码,我还会发现:
找不到与请求的java类[it.egeos.cut3g.cskcsgadapter.common.aremodels.pointaremodel]匹配的作用域javatypedescriptor;返回到静态注册表00:08:01.303调试(registryhelper。java:56)为java类[org.locationtech.jts.geom.point]00:08:01.304调试(jdbctypejavaclassmappings)使用缓存的javatypedescriptor示例。java:65)类[org.locationtech.jts.geom.geometry]未知的jdbc类型代码Map;使用自定义代码[1178270318]
奇怪的是,我可以在实体的私有字段上使用点或几何体作为数据类型而没有任何问题。这个问题似乎只与转换器有关。在使用转换器时,hibernate似乎无法识别postgis类型。显然,我已经设置了正确的方言(postgis),因为它在除转换器之外的任何地方都能正常工作。我也试着用同样的结果把点变成几何学。如果我把point改成string,一切都很好。
最后一次尝试是在我的实体中添加显式列定义:
@Column(columnDefinition = "Geometry")
在这种情况下,应用程序将启动,架构将正确生成,但当尝试插入时,会显示一条错误消息:
00:45:09.387调试(attributeconvertersqltypedescriptoradapter。java:87)绑定时转换的值:it.egeos.cut3g.cskcsgadapter.common.aremodels。pointareamodel@17d606c9 ->点(12)00:45:09.388记录道(basicbinder。java:64)绑定参数[5]为[varbinary]-[point(12)]00:45:09.391信息(abstractbatchimpl。java:208)HH000010:发布时它仍然包含jdbc语句00:45:09.394信息(conditionevaluationreportlogginglistener)。java:136)启动applicationcontext时出错。要显示条件报告,请在启用“调试”的情况下重新运行应用程序。00:45:09.413错误(springapplication。java:856)应用程序运行失败java.lang.illegalstateexception:未能在org.springframework.boot.springapplication.callrunner(springapplication)上执行commandlinerunner。java:807)在org.springframework.boot.springapplication.callrunners(springapplication。java:788)在org.springframework.boot.springapplication.run(springapplication。java:333)在org.springframework.boot.springapplication.run(springapplication。java:1309)在org.springframework.boot.springapplication.run(springapplication。java:1298)at it.egeos.cut3g.cskcsgadapter.exability.application.main(应用程序。java:33)原因:org.springframework.orm.jpa.jpasystemexception:请求的未知展开转换:org.locationtech.jts.geom.geometry to[b;嵌套异常为org.hibernate.hibernateexception:请求的未知展开转换:org.locationtech.jts.geom.geometry到[b at org.springframework.orm.jpa.vendor.hibernatejpadialect.converthibernateaccessexception(hibernatejpadialect)。java:331)在org.springframework.orm.jpa.vendor.hibernatejpadialect.translateexceptionifpossible(hibernatejpadialect。java:233)
有人能帮我找到解决办法吗?提前谢谢。
更新1:我找到了这个参考https://gitter.im/hibernate/hibernate-orm?at=5ab11305e4d1c636041f1251 如果你搜索“方言”,你会看到一个类似的问题。答案似乎是转换器不支持几何体类型。也许用Hibernate6就可以了。有人还有别的建议吗?
暂无答案!
目前还没有任何答案,快来回答吧!