Próbuję zintegrować Spring Roo z bazą danych PostgreSQL z obsługą PostGIS za pośrednictwem Hibernate, postępując zgodnie z samouczkiem Hibernate Spatial . Wszystkie rzeczy nie związane z GIS działają dobrze, a ja stworzyłem bazę danych z szablonu PostGIS.

Problem polega na tym, że jak tylko dodam właściwość Geometry do jednej z moich jednostek:

@Type(type="org.hibernate.spatial.GeometryType")
private Point centerPoint;

... kompiluje się dobrze, ale próba uruchomienia na serwerze (i faktycznie interakcji z bazą danych) powoduje poniższy błąd:

Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: 3000
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:77)
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:100)
    at org.hibernate.dialect.Dialect.getTypeName(Dialect.java:298)
    at org.hibernate.mapping.Column.getSqlType(Column.java:208)
    at org.hibernate.mapping.Table.sqlCreateString(Table.java:418)
    at org.hibernate.cfg.Configuration.generateSchemaCreationScript(Configuration.java:1099)
    at org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:106)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:372)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
    ... 41 more

Zależności Hibernate Spatial wydają się sugerować, że wymagane jest postgis-jdbc 1.5.3 ale 1.5.3 nie występuje w żadnych repozytoriach Maven i nie mogę go skompilować ze źródeł. Próbowałem 1.5.2 i 1.3.3 i oba powodują ten sam błąd 3000. HS mówi, że 1.5.3 powinno być "dostarczone", ale ustawienie zależności na 1.5.3 i <scope>provided</scope> też nie pomaga.

Czy jest to po prostu przypadek, gdy potrzebna jest dokładna wersja JDBC, czy może coś innego jest nie tak?

Odpowiedni wyciąg z mojego POM jest następujący:

        <dependency>
            <groupId>com.vividsolutions</groupId>
            <artifactId>jts</artifactId>
            <version>1.12</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-spatial</artifactId>
            <version>4.0-M1</version>
        </dependency>
        <dependency>
            <groupId>org.postgis</groupId>
            <artifactId>postgis-jdbc</artifactId>
            <version>1.5.2</version>
        </dependency>

A od persistence.xml:

<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisDialect"/>
3
orlade 28 sierpień 2012, 13:14

2 odpowiedzi

Najlepsza odpowiedź

Twój wyjątek oznacza, że ​​dialekt Postgresql nie obsługuje typu danych podanego przez adnotację. Rozszerzenie go o niestandardową klasę w celu dodania obsługi może być sposobem na rozwiązanie problemu.

Przyjrzałem się projektowi GIS, czy zapewniasz również zależność javassist z zakresem kompilacji?

Czy próbowałeś odwołać się do swoich typów danych za pomocą poniższych adnotacji? Zobacz https://stackoverflow.com/a/3047190/390462.

@Column(name = "geometry", columnDefinition="Geometry", nullable = true) 
private Geometry geometry;

O ile zrozumiałem, musisz nadać swojemu polu columnDefinition, w przeciwnym razie nie będzie w stanie zmapować pola do dobrej kolumny db.

5
Community 23 maj 2017, 15:32

Znalazłem rozwiązanie!

(Grails, Hibernate Spatial 4.3, Config.groovy)

hibernate {
    // ...
    dialect = 'org.hibernate.spatial.dialect.postgis.PostgisDialect'
}
0
AndreyT 18 luty 2015, 16:44