Hibernate 和 Geolatte Point 无法反序列化

问题描述 投票:0回答:1

我有一个带有 Geolatte Point 对象的类,当从数据库检索该对象时,该类抛出无法反序列化错误。

环境是Java 18、Spring Boot 3.2和Hibernate 6.2以及MySQL8。

包含Point字段的类是:

@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
@Data
@JsonIgnoreProperties({"hibernateLazyInitalizer", "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;

private Point<G2D> location;

// Getters and Setters

在 application.properties 中我正在初始化数据库

INSERT INTO HEALTH_CHECK (id, location, catch_date_time)
VALUES (6, ST_PointFromText('POINT(4.33 53.21)', 4326),'2023-06-01 13:00:00');

当我尝试检索此对象时,我得到

Caused by: org.hibernate.type.SerializationException: could not deserialize

然后,我将完全相同的点坐标添加到 java 中的类(而不是通过 application.properties SQL),并且我能够毫无问题地设置和检索 Check 类,即:

Point<G2D> pnt=point(WGS84,g(4.33,53.21));
Check c = checkRepository.findById(5L).orElse(null);
c.setLocation(pnt);
checkRepository.save(hc);
// then evalulate expression shows entity with coords.

因此,该错误似乎与 Hibernate/Geolatte 将坐标应用到 MySQL 中的数据库的方式有关。

我比较了数据库列中的存储工作(Java 集)与 MySQL SQL 语句集值:

工作: 0xACED00057372002D6F72672E67656F6C617474652E67656F6D2E47656F6D657472792453657269616C697A6174696F6E50726F7879550F75859A8CA892 0200015B00066275666665727400025B427870757200025B42ACF317F8060854E00200007870000000190101000020E610000052B81E85EB5111407B14AE47 E19A4A40

不工作: 0xE610000001010000007B14AE47E19A4A4052B81E85EB511140

我注意到,如果我在控制台上尝试使用 SQL 来检索非工作点

SELECT ST_AsText(location) FROM check WHERE id=5
,我会收到错误“3055 几何字节字符串必须是小尾数”。

如果这不是错误 - 我做错了什么?

java sql hibernate gis geospatial
1个回答
0
投票

我发现我的 build.gradle 中存在错误,导致空间依赖项无法导入。我的 build.gradle 是:

implementation group: 'org.hibernate', name: 'hibernate-spatial', version: '6.2.6.Final', ext: 'pom'

它不应该有

pom
而应该是:

implementation group: 'org.hibernate.orm', name: 'hibernate-spatial', version: '6.2.6.Final'

现在一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.