mysqlspring-boothibernateliquibaseliquibase-hibernate

Liquibase generate migration for geometry type (Spring boot with JPA/Hibernate)


I am writing a RESTfull API with Spring boot using Maven Liquibase to manage migrations alongside MySQL 8 for the database.

I have searched online (1,2, 3) but Liquibase is still generating "TINYBLOB" type in migrations instead of "POINT" or "GEOMETRY". Surprisingly, when I edit the migration file (i.e. changeSet and use "POINT", mvn liquibase:update still creates a TINYBLOB column on the database.

I have a typal JPA entity:

import org.locationtech.jts.geom.Point;


@Entity
class MyModel {

  private Point location;

  // more fields

I am using Liquibase version 4.3 and Hibernate version 5.4. For hibernate dialect, I am using org.hibernate.spatial.dialect.mysql.MySQL8SpatialDialect.

It appears to me that spatial types are not supposed by Liquibase... but that would be surprising. Any help would be greatly appreciated (all other data types are behaving as expected).


Solution

  • Ran into the same issue some time ago and ended up manually overwriting parts of the auto-generated migration file. Worked fine for MySQL 8.

     <!--    Define the type-->
    <property name="pointType" value="geometry" dbms="h2"/> <!--    Only relevant for in-memory integration tests-->
    <property name="pointType" value="POINT" dbms="mysql, oracle, mssql, mariadb, postgresql"/>
    
    <!--    Use the type on the column-->
    <column name="location" type="${pointType}">
        <constraints nullable="true" />
    </column>
    

    A simplified version of my Hibernate model.

    package com.stackoverflow.sample.domain;
    
    
    import com.vividsolutions.jts.geom.Point;
    import org.hibernate.annotations.Type;
    import org.springframework.data.elasticsearch.annotations.FieldType;
    
    import javax.persistence.*;
    import java.io.Serializable;
    
    
    @Entity
    @Table(name = "some_entity")
    public class SomeEntity implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @org.springframework.data.elasticsearch.annotations.Field(type = FieldType.Keyword)
        private Long id;
    
        @Type(type = "com.vividsolutions.jts.geom.Point")
        @Column(name = "location", nullable = false, columnDefinition = "geometry")
        private Point location;
    
    }