【问题标题】:How to insert into geo point column in spring data-jpa + mysql 8?如何在spring data-jpa + mysql 8中插入地理点列?
【发布时间】:2021-11-07 22:16:04
【问题描述】:

我的环境

  • mysql 8.0.25
  • 休眠核心:5.4.32
  • 休眠空间:5.4.32
  • spring-boot2.5.4
  • java 8

我做了什么

application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/database?serverTimezone=UTC&characterEncoding=UTF-8
    username: root
    password: password
  jpa:
    hibernate.ddl-auto: create
    generate-ddl: true
    database: mysql
    properties:
      hibernate.dialect: org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect

logging:
  level:
   org:
    hibernate:
      SQL: debug
      type: trace

实体类

import com.example.mypackage.domain.BaseTimeEntity;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.geo.Point;

import javax.persistence.*;

@Getter
@NoArgsConstructor
@Entity
public class Party extends BaseTimeEntity { // BaseTimeEntity adds modifiedAt, createdAt columns

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(columnDefinition = "TEXT")
    private String title;

    @Column(columnDefinition = "POINT")
    private Point coordinate;

    @Builder
    public Party(Point coordinate, String title, String body) {
        this.coordinate = coordinate;
        this.title = title;
        this.body = body;
    }
}


测试

@SpringBootTest
class PartyRepositoryTest {

    @Autowired
    PartyRepository partyRepository;

    @Test
    public void register_party() {
        // Given
        Double x = 127.02558;
        Double y = 37.30160;
        Point coordinate = new Point(x, y);
        partyRepository.save(
            Party.builder()
                    .coordinate(coordinate)
                    .title("test title")
                    .build()
        );

        // When
        List<Party> partyList = partyRepository.findAll();

        // Then
        Party party = partyList.get(0);
        assertEquals(x, party.getCoordinate().getX());
        assertEquals(y, party.getCoordinate().getY());
    }

我的预期

在 'party' 表中插入行成功

实际发生了什么

我有错误。日志如下。

insert into party (created_at, modified_at, body, coordinate, title) values (?, ?, ?, ?, ?)
binding parameter [1] as [TIMESTAMP] - [2021-09-12T14:45:31.018]
binding parameter [2] as [TIMESTAMP] - [2021-09-12T14:45:31.018]
binding parameter [3] as [VARCHAR] - []
binding parameter [4] as [VARBINARY] - [Point [x=127.025580, y=37.301600]]
binding parameter [5] as [VARCHAR] - [test title]
SQL Error: 1416, SQLState: 22001
Data truncation: Cannot get geometry object from data you send to the GEOMETRY field

问题

  • 请告诉我我做错了什么?
  • hibernate-spatial 是否支持 mysql 点?

【问题讨论】:

    标签: spring-data-jpa hibernate-spatial


    【解决方案1】:

    您使用了错误的空间类型:Hibernate Spatial 不支持org.springframework.data.geo.Point。在您的实体类中使用org.locationtech.jts.geom.*org.geolatte.geom.* 应该没问题。

    【讨论】:

      【解决方案2】:

      经过大量研究,这对我来说是这样的:

      • 语言:科特林
      • MySQL 版本:8.0.23

      build.gradle.kts

      ...
      implementation("org.hibernate:hibernate-spatial:5.6.2.Final")
      ...
      

      properties.yml

      ...
      spring:
        jpa:
          properties:
            hibernate.dialect: org.hibernate.spatial.dialect.mysql.MySQL8SpatialDialect
          database-platform: org.hibernate.spatial.dialect.mysql.MySQL8SpatialDialect
      ...
      

      实体:

      package svns.mono.fad.springcore.data.entity
      
      ...
      import org.locationtech.jts.geom.Point
      ...
      
      
      @Entity
      @Table(name = "issue")
      data class IssueEntity(
          ...
          val location: Point,
          ...
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-31
        • 2018-12-24
        • 2018-01-13
        • 2018-01-23
        • 2016-10-10
        • 1970-01-01
        相关资源
        最近更新 更多