Ответ 1
Вы должны попробовать иметь тип в своем db как Geometry, мне также не удалось сделать это с помощью mySQL. Геометрия отлично подходит для очков.
Есть ли способ сопоставить столбцы Point с полем Java?
Я попробовал Hibernate Spatial 4.0, но кажется, что он не работает с чистым PostgreSQL без PostGIS. Вот определение поля точки:
import com.vividsolutions.jts.geom.Point;
...
@Column(columnDefinition = "point")
@Type(type = "org.hibernate.spatial.GeometryType")
private Point location;
Диалект в persistence.xml:
<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisDialect" />
И когда я пытаюсь сохранить этот объект, возникает исключение:
org.postgresql.util.PSQLException: Unknown type geometry.
at org.postgresql.jdbc2.AbstractJdbc2Statement.setPGobject(AbstractJdbc2Statement.java:1603)
at org.postgresql.jdbc2.AbstractJdbc2Statement.setObject(AbstractJdbc2Statement.java:1795)
at org.postgresql.jdbc3g.AbstractJdbc3gStatement.setObject(AbstractJdbc3gStatement.java:37)
at org.postgresql.jdbc4.AbstractJdbc4Statement.setObject(AbstractJdbc4Statement.java:46)
at org.hibernate.spatial.dialect.AbstractJTSGeometryValueBinder.bind(AbstractJTSGeometryValueBinder.java:48)
at org.hibernate.spatial.dialect.AbstractJTSGeometryValueBinder.bind(AbstractJTSGeometryValueBinder.java:39)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:275)
at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:57)
Кажется, что он пытается сохранить ценность как тип геометрии PostGIS. Но я хочу использовать просто простую точку.
Вы должны попробовать иметь тип в своем db как Geometry, мне также не удалось сделать это с помощью mySQL. Геометрия отлично подходит для очков.
Я могу предложить более универсальный способ через @Embedded Entity (он не зависит от типа базы данных!), который я использовал для проектов.
Пример ниже:
Часть SQL-запроса для создания таблицы с LAT и LONG:
CREATE TABLE some_table (
lat NUMBER(..., ...),
long NUMBER(..., ...),
...
);
Встраиваемая точка:
@Embeddable
public class Point {
private BigDecimal x;
private BigDecimal y;
...
}
Пользовательский объект:
@Entity
@Table(name = "some_table")
public class SomeEntity {
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "lat", column = @Column(name = "x")),
@AttributeOverride(name = "long", column = @Column(name = "y"))
})
private Point point;
...
}
УСТАНАВЛИВАЙТЕ ПОСТОЯННЫЕ РАСШИРЕНИЯ В ВАШЕЙ БАЗЕ ДАННЫХ.
Ошибка, с которой вы сталкиваетесь, связана с тем, что вы не установили ничего в своей базе данных, к которой может относиться Hibernate. Это postgres, который жалуется, а именно:
org.postgresql.util.PSQLException: геометрия неизвестного типа.
Ваши аннотации и настройки говорят, что они зависят от PostGIS:
<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisDialect" />
Итак, вы пытаетесь использовать неподдерживаемую конфигурацию.
PostgreSQL не поставляется со всеми возможными типами данных, о которых когда-либо думали, как это делает Oracle. Поэтому, когда Hibernate говорит: "Я хочу, чтобы" геометрия "PostgreSQL просто говорила" что такое геометрия? "PostgreSQL очень расширяема, чтобы люди PostGIS делали - они построили расширение. Любой может установить его или запустить без него. это приводит к тому, что кто-то ожидает его в готовой базе данных, а не в качестве дополнения.
Я полагаю, вы можете попытаться перепроектировать типы данных PostgreSQL и скомпилировать их в своей базе данных. Геометрия - главный суперкласс для PostGIS, по крайней мере, в Java, и он выглядит одинаково в базе данных. Я просто не понимаю, почему вы настроили конфигурацию, когда вы никому не захотите ее поддерживать.
@bluish это помогает?
Как я не совсем уверен в этом вопросе, позвольте мне сначала перефразировать:
Вы хотите сопоставить объект, имеющий поле типа com.vividsolutions.jts.geom.Point в столбце базы данных PostgreSQL типа "point" (см. геологические типы postgreSQL), используя спящий режим, ограничивая себя стандартным диалектом PostgreSQLDialect.
Некоторые исследования приводят меня к выводу, что вышеупомянутый поддерживаемый гибернатом стандартный диалект не поддерживает тип точки PostgreSQL вообще. Поэтому вы можете предоставить свой UserType. Посмотрите Пользовательские типы из руководства спящего режима или Понимание и запись пользовательских пользовательских типов Hibernate для примера из блога.