Ошибка отображения в Hibernate Spatial 5.0.4. Столбец геометрии Final и PostgreSQL

Я хочу связать столбец PostgreSQL ("b_shp") типа "геометрия". В частности, следующий запрос дает результат "POLYGON":

SELECT GeometryType(b_shp)   ==>  "POLYGON"

Я не могу найти правильную аннотацию для @Column "b_shp" в моем @Entity.

Я попробовал эти аннотации:

@Column(name="b_shp", columnDefinition="geometry(MultiPolygon,4326)")   
private com.vividsolutions.jts.geom.MultiPolygon b_shp;

а также:

@Column(name="b_shp", columnDefinition="geometry")  
private com.vividsolutions.jts.geom.Geometry b_shp;

получить эту ошибку:

ERROR:
javax.ejb.EJBException: java.lang.IllegalStateException: Received object of type org.postgresql.util.PGobject

Я использую:

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.0.4.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-spatial</artifactId>
            <version>5.0.4.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.4.Final</version>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.4-1205-jdbc42</version>
        </dependency>

        <dependency>
            <groupId>org.postgis</groupId>
            <artifactId>postgis-jdbc</artifactId>
            <version>1.3.3</version>
        </dependency>

Что такое правильная аннотация?

1 ответ

Я считаю, что это не проблема с вашей аннотацией. Я столкнулся с той же ошибкой и смог ее решить, не используя источник данных, предоставленный моей wildfly, и вместо этого подключился к базе данных следующим образом (persistence.xml):

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="org.hibernate.events.jpa" transaction-type="JTA">
   <properties>
       <property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisDialect"/>
       <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
       <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/yourdatabase"/>
       <property name="hibernate.connection.username" value="username"/>
       <property name="hibernate.connection.password" value="password"/>
       <property name="hibernate.connection.pool_size" value="5"/>

       <property name="hibernate.show_sql" value="false"/>
       <property name="hibernate.format_sql" value="true"/>

       <property name="hibernate.max_fetch_depth" value="5"/>

       <property name="hibernate.hbm2ddl.auto" value="update"/>
   </properties>
</persistence-unit>

Кроме того, поскольку ранние версии hibernate версии 5.0.x, по-видимому, не имеют должной интеграции hibernate-пространственный и во избежание проблем с classpath, я добавил файл jboss-deploy-structure.xml в свой META-INF:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
         <exclusions>
            <module name="org.hibernate" />
            <module name="org.postgresql" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

Это предотвратит использование вашего развертывания с помощью предоставленного wildfly hibernate, так что вы можете вместо этого добавить зависимость для самой последней версии hibernate (5.1.0 на момент написания этой статьи). Затем вам нужно будет добавить зависимости для hibernate, hibernate-atial и postgresql-jdbc.

Также обратите внимание, что hibernate 5 больше не требует аннотации @Type.

Мне удалось заставить мой проект работать с вышеуказанными настройками и одной из моих сущностей со следующим атрибутом / столбцом:

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

Надеюсь, это поможет, удачи!

Редактировать:

Я подготовил рабочий пример проекта, демонстрирующий использование wf10/hibernate5/postgis - проверьте его на github:

https://github.com/Pulvertoastmann/wf10postgis/

Другие вопросы по тегам