Hibernate与Geolatte Point反序列化失败问题排查
问题根源
你遇到的是地理数据字节序不匹配的问题:
- Java代码保存数据时,Hibernate会把Geolatte的
Point<G2D>序列化为**小端(little-endian)的OGC标准WKB(Well-Known Binary)**格式 - 直接用
ST_PointFromText插入数据时,MySQL默认生成的是大端(big-endian/XDR)的WKB格式
两种格式不兼容,导致Hibernate反序列化失败,同时查询时触发3055 Geometry byte string must be little endian错误。
解决方案
1. 修正SQL插入语句(转换字节序)
用MySQL的ST_SwapByteOrder函数,把ST_PointFromText生成的大端WKB转成小端格式,和Hibernate保存的格式对齐:
INSERT INTO CHECK (id, location, catch_date_time) VALUES (6, ST_SwapByteOrder(ST_PointFromText('POINT(4.33 53.21)', 4326)), '2023-06-01 13:00:00');
插入后的数据二进制格式就和Java代码保存的一致,Hibernate能正常反序列化。
2. 优化实体类字段映射(可选但推荐)
显式指定字段的数据库类型和Hibernate处理器,避免自动映射的歧义:
@AllArgsConstructor @NoArgsConstructor @ToString @Entity @Data @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) @SequenceGenerator(name="check_seq", sequenceName = "CHECK_SEQ", initialValue = 100, allocationSize = 50) @Table(name="CHECK") public class Check { @Id @GeneratedValue(strategy = SEQUENCE, generator = "check_seq") private Long id; @Column(columnDefinition = "POINT SRID 4326") @Type(GeolatteGeometryType.class) private Point<G2D> location; // Getters and Setters }
columnDefinition明确数据库字段是带SRID 4326的POINT类型@Type指定用Geolatte专用的类型处理器,保证序列化/反序列化逻辑统一
验证方法
插入后执行以下查询,确认能正常解析:
SELECT ST_AsText(location) FROM CHECK WHERE id=6;
此时应该返回POINT(4.33 53.21),Java查询也不会再抛出反序列化错误。
内容的提问来源于stack exchange,提问作者Al Grant
相关产品推荐
相关产品推荐

