본문 바로가기

Slack 채널 정리

JPA 에서 mariaDB point 타입 이용 방법

1. 네이티브 쿼리 안쓰고 mariaDB 에 Point 타입 값 저장하려고 별 짓 다해봤는데 계속 실패 - Cannot get geometry object from data you send to the GEOMETRY field.'
2.  https://raul8804.wordpress.com/2018/04/25/integrate-geometry-with-mysql-and-spring-jpa/  https://stackoverflow.com/questions/45713934/jackson-deserialize-geojson-point-in-spring-boot/47952637 등을 참고하여 jtsModule, GeometryDeserializer 등까지도 시도해봤는데 역시나 실패.
3. Hibernate 문서 다시 보다보니 com.vividsolutions jts 라이브러리 아닌 org.locationtech.jts 사용하고 있는게 보여서 라이브러리 변경했더니 별다른 애노테이션이나 기타 추가 코드 없이 잘 됨. https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#spatial-types
4. 검색해보면 나오는 대부분의 문서는 com.vividsolutions 사용하고 있으니 혹 도전해보실 분들은 우선 이것부터 해보는게 좋을 듯 싶네요 ( org.locationtech.jts 로 save 만 성공했지 아직 다른 것들은 저도 확인해보지 못해서 )

 

Hibernate ORM 5.4.9.Final User Guide

The legacy way to bootstrap a SessionFactory is via the org.hibernate.cfg.Configuration object. Configuration represents, essentially, a single point for specifying all aspects of building the SessionFactory: everything from settings, to mappings, to strat

docs.jboss.org

// pom.xml
		<dependency>
			<groupId>org.locationtech.jts</groupId>
			<artifactId>jts-core</artifactId>
			<version>1.16.1</version>
		</dependency>
		
// Util
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Point;

public class GeomUtil {
    public static GeomUtil geomUtil = new GeomUtil();

    public static Point createPoint(double lat, double lon) {
        GeometryFactory gf = new GeometryFactory();
        return gf.createPoint(new Coordinate(lat, lon));
    }
}

// Entity
@Entity
@Data
@Table(name = "gis_point")
public class GisPoint implements Serializable
    ...
    private double posLat;
    private double posLon;

    private Point machPt;
}

// save Point type 
@Autowired
private GisPointRepository gisPointRepository;

void saveGisPoint(GisPoint gisPoint) {
    Point pt = GeomUtil.createPoint(gisPoint.getPosLat(), gisPoint.getPosLon());
    gisPoint.setMachPt(pt);
    gisPointRepository.save(gisPoint);
}