我有一个带有Geolatte Point对象的类,当从数据库中检索它时,它会抛出一个无法实现的错误。
环境是Java 18,Sping Boot 3.2和Hibernate 6.2以及MySQL 8。
包含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语句集值:
工作:0xACED00057372002D6F72672E67656F6C617474652E67656F6D657472792453657269616C697A6174696F6E50726F7879550F75859A8CA8920200015B000662756666665727400025B42787075720002 5B42ACF317F8060854E00200007870000000190101000020E610000052B81E85EB5111407B14AE47E19A4A40
不工作:0xE610000001010000007B14AE47E19A4A4052B81E85EB511140
我注意到,如果我在控制台上尝试SQL检索非工作点与SELECT ST_AsText(location) FROM check WHERE id=5
我得到错误'3055几何字节字符串必须是小端'。
如果这不是一个bug -我做错了什么?
1条答案
按热度按时间sgtfey8w1#
我发现我的build.gradle中有一个错误,导致空间依赖性无法导入。My build.gradle was:
它不应该有
pom
,而应该是:现在一切正常