Hibernate和Geolatte Point无法实现

lpwwtiir  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(104)

我有一个带有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 -我做错了什么?

sgtfey8w

sgtfey8w1#

我发现我的build.gradle中有一个错误,导致空间依赖性无法导入。My build.gradle was:

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'

现在一切正常

相关问题