Элемент Point (org.springframework.data.geo.Point) сохраняется в Postgresql как Bytea. Почему и как мне сохранить координаты точки?

210
24 июня 2019, 07:00

Начал изучать Java и Spring framework. Делаю задание, часть которого - хранение набора точек с привязкой к какой-то площади (не важно к какой, к вопросу это не относится) и поиск ближайшей из набора к заданной точке.

Создал такую сущность.

package com.parkinghelper.parker.domain;
import lombok.Data;
import org.springframework.data.geo.Point;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
@Entity
@Table(name = "parking_place")
@Data
public class ParkingPlace {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @NotNull
    private Point coordinate;
    private Boolean isFree;
    @ManyToOne
    @JoinColumn(name = "area")
    private ParkingArea area;

    public ParkingPlace() {
    }
}

Столкнулся с проблемой, что Sping data создает таблицу с полем точки (coordinate) сохраняет как Bytea. Соответственно в запросе обработать этот набор не получается.

В самом postgresql есть тип Point и если предварительно создать таблицу с этим типом, то hibernate (если я правильно понял, то именно эта реализация JPA отвечает за работу с БД. Подправьте если это не так) не может подключиться к такой таблице созданной сущностью.

При попытке взять данные из БД выпадает исключение

 "could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize"

Полный trace выглядит страшно.

Собственно вопрос следующий. Почему такая несогласованность типов у spring.data и postgresql. Как с этим бороться (хотелось бы использовать стандартный тип Point из БД, т.к. нужны фищки для работы с ним в запросе)?

Быть может версии не стыкуюстся или же мне нужно использоваться другую СУБД, например Oracle?

В интернете толком не нашел информации по этому вопросу, только то, что можно использовать PostGis для таких целей.

Проперти следующие:

spring.datasource.url=jdbc:postgresql://localhost/postgres
spring.datasource.username=postgres
spring.datasource.password=123456
spring.jpa.generate-ddl=true

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
server.port=8080
spring.jpa.show-sql=true

Репозиторий:

@Repository
public interface ParkingPlaceRepository extends JpaRepository<ParkingPlace,Long> {
}

Версия Postgresql: PostgreSQL 11.1, compiled by Visual C++ build 1914, 64-bit

Версия java: 10.0.2

Answer 1

Не надо привязываться к классам из Spring Data. Поскольку данные классы не могут быть энтитями в таком виде как они есть, и нельзя соответственно конвертировать их в объекты.

Перед тем как использовать классы в сущьностях убедитесь что они имплементируют java.util.Serializable интерфейс.

READ ALSO
SQL запросы в Hibernate

SQL запросы в Hibernate

Могу ли я в контексте Spring + Hibernate сделать простой sql запрос и получить список элементов ( как в JDBC - ResultSet) для запроса данных из таблицы, не входящей...

217
Java Tomcat Listener повторная отправка запроса

Java Tomcat Listener повторная отправка запроса

Написал в томкате в webxml

142
Проблемы с VK API

Проблемы с VK API

Пишу програмку на джаве с использованием vk api, и проблема с методом messagessend

201