Hibernate Spatial 5 — GeometryType

После обновления Hibernate-spatial до версии 5.0.0.CR2 следующее объявление больше не работает:

@Column(columnDefinition = "geometry(Point,4326)")
@Type(type = "org.hibernate.spatial.GeometryType")
private Point position;

с:

org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [org.hibernate.spatial.GeometryType]

Как я вижу, класс больше не существует в Jar-файле. Что случилось с GeometryType и как его заменить? Или есть еще один jar-файл для включения?

Изменить: для уточнения. Я использую Hibernate-Spatial в сочетании с базой данных PostgreSQL-Postgis.


person Denis Lukenich    schedule 15.07.2015    source источник


Ответы (6)


Что ж, решение слишком легко увидеть. Просто удалите аннотацию @Type, чтобы объявление выглядело так:

@Column(columnDefinition = "geometry(Point,4326)")
private Point position;

Источник:

Обратите внимание на аннотацию @Type. Это информирует Hibernate о том, что атрибут местоположения имеет тип Geometry. Аннотация @Type специфична для Hibernate и является единственной требуемой аннотацией, отличной от JPA. (В будущих версиях Hibernate (версия 5 и более поздние) больше не будет необходимости явно объявлять атрибуты со значением Type of Geometry.)

person Denis Lukenich    schedule 20.09.2015
comment
Документация по спящему режиму и любой другой пост не работали для спящего режима 5, но ваш ответ сработал! Спасибо! - person Bharath Lakshman; 15.10.2016
comment
Мне также пришлось использовать правильный GeometryFactory для создания объекта Point. Использование new GeometryFactory(new PrecisionModel(), 4326) сработало для меня. - person Wim Deblauwe; 01.03.2018

Решение, предложенное Денисом выше, у меня не сработало на пространственных Hiberate 5 и Mysql. Однако следующие аннотации работали для меня

  @Column(name = "location",columnDefinition="Geometry")
  private Geometry location;


  @Column(name = "pointlocation",columnDefinition="Point")
  private Point pointlocation;

Если вы используете Hibernate 5.3+, вы можете пропустить определения столбцов.

  @Column(name = "location")
  private Geometry location;


  @Column(name = "pointlocation")
  private Point pointlocation;
person Ganesh Krishnan    schedule 20.01.2016
comment
этот, мне помогает - person horoyoi o; 04.02.2020

Для Hibernate Spatial 5.2.x все, что вам нужно, это ниже в вашей сущности.

private Point location;

Вам не нужны columnDefinition или Type, как упомянутые выше решения.

Некоторые дополнительные детали и проверки, чтобы увидеть, работает ли вышеперечисленное

  • Как только вы запустите установку и используете desc table_namein mysql, вы должны увидеть тип поля geometry. Это указывает на то, что сопоставление гибернации с базой данных работает нормально.
  • Теперь попробуйте создать объект и repo.save(entity) из java, и ваш объект должен сохраниться без каких-либо ошибок.

Если приведенная выше настройка не сработала, вы обычно получаете сообщение об ошибке

Усечение данных: невозможно получить объект геометрии из данных, которые вы отправляете в поле GEOMETRY.

Надеюсь, это поможет кому-то сэкономить 6 часов, которые я потратил впустую!

person HopeKing    schedule 02.05.2018
comment
Идеально, именно то, что я искал. Другие ответы выше не будут работать с Hibernate 5.3, как только я удалю определение столбца, все заработает отлично. - person jste89; 16.06.2018

Итак, я боролся с этой проблемой в течение нескольких дней, дело в том, что я хотел, чтобы тип базы данных был из типа postgis, чтобы я мог выполнять эффективные запросы расстояния для ближайшего соседа и т. д. Я наконец понял, как это сделать и хотел поделиться им с сообществом, поэтому я создал демонстрационный проект, содержащий решение проблемы.

Моя установка представляет собой базу данных PostgreSQL с Postgis, Spring boot jpa, Hibernate 5+, Hibernate-spatial 5+, а также добавлено преобразование в rest output, для чего снова потребовался специальный модуль от jackson.

проект находится по адресу https://github.com/Wisienkas/springJpaGeo.

важный код, который вы просили, был следующим:

@type(type = "jts_geometry")
private Point point;
person Wisienkas    schedule 01.05.2017
comment
Что такое тип jts_geometry? Я думал, что это значение должно быть полным именем класса? - person Hervian; 27.07.2017
comment
Нашел ссылку: docs.jboss.org/ спящий режим/orm/5.2/userguide/html_single/ - person Hervian; 27.07.2017

По-видимому, ваши библиотеки Hibernate также должны быть одной версии.

Я использовал postgis/springboot/hibernate-spatial.

Первоначально Hibernate-Spatial был @ 5.4.10.Final и не работал даже с решениями здесь.

Затем я посмотрел, какая версия спящего режима была в моих зависимостях maven ( hibernate-commons-annotations-5.1.0.Final.jar ), и вспомнил, что где-то видел, что версии спящего режима должны совпадать.

Поэтому я понизил свой Hibernate-Spatial до 5.1, и следующий оператор сопоставления работает без дополнительной информации:

// Geometry Object is from the following import
import com.vividsolutions.jts.geom.*;

@Column(name="domain_loc")
private Geometry location;
person Paulito.Bandito    schedule 02.02.2020
comment
Ты спас меня! Я только что сделал обновление с весенней загрузкой, и оно пришло с обновлением гибернации. Поэтому я только что проверил эти зависимости и понизил версию hibernate-spatial до 5.1.0.Final. Теперь это работает! - person hEngi; 28.09.2020
comment
Рад, что это также помогло вам!! - person Paulito.Bandito; 28.09.2020

Я использую спящий режим 4.3.6 и спящий режим 5.2.2. Решение, предложенное выше, не сработало для меня. Однако приведенный ниже код работал, если я добавлю спящий режим 4.3

@Type(type="org.hibernate.spatial.GeometryType")
private Point location;
person Hasnu zama    schedule 04.10.2016