You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 00:06:11