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"/>
2 odpowiedzi
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.
Znalazłem rozwiązanie!
(Grails, Hibernate Spatial 4.3, Config.groovy)
hibernate {
// ...
dialect = 'org.hibernate.spatial.dialect.postgis.PostgisDialect'
}
Podobne pytania
Powiązane pytania
Nowe pytania
hibernate
Hibernate jest biblioteką mapowania obiektowo-relacyjnego (ORM) dla języka Java, umożliwiającą programistom wykorzystanie modeli domen w stylu POJO w ich aplikacjach w sposób znacznie wykraczający poza mapowanie obiektowe / relacyjne.