У меня есть проект Spring Roo + Hibernate, который принимает ввод строки известного текста JTS (WKT) из клиентского приложения, преобразует его в объект JTS Geometry, а затем пытается записать его в базу данных PostGIS. У меня были проблемы с соединением JDBC и типами, но, похоже, они были решены с помощью:
@Column(columnDefinition = "Geometry", nullable = true)
private Geometry centerPoint;
И преобразование делает:
Geometry geom = new WKTReader(new GeometryFactory(new PrecisionModel(), 4326)).read(source);
Однако теперь, когда Hibernate пытается записать мой объект Geometry в базу данных, я получаю сообщение об ошибке:
2012-08-31 21:44:14,096 [tomcat-http--18] ERROR org.hibernate.util.JDBCExceptionReporter - Batch entry 0 insert into land_use (center_point, version, id) values ('<stream of 1152 bytes>', '0', '1') was aborted. Call getNextException to see the cause.
2012-08-31 21:44:14,096 [tomcat-http--18] ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: Invalid endian flag value encountered.
Кажется очевидным, что ошибка связана с двоичным представлением, которое предположительно создается как хорошо известный двоичный файл (WKB) с некоторым порядок байтов. Однако с Hibernate, скрывающим всю настойчивость, я не могу точно сказать, в каком направлении идут дела.
Я боролся с этой геометрией несколько дней, и информации об этой ошибке очень мало, так что у кого-нибудь есть какие-нибудь блестящие идеи? Могу ли я где-нибудь указать порядок байтов (Hibernate или PostGIS) или, возможно, сохранить в другом формате (WKT)?
РЕДАКТИРОВАТЬ: Я также должен упомянуть, что я использую все самое новое, что в целом кажется совместимым:
- Spring 3.1.1, Roo 1.2.1
- спящий режим 3.6.9
- спящий пространственный 4.0-M1
- jts 1.12
- PostgreSQL 9.1
- postgis-jdbc 1.5.3 (не последняя, но рекомендуется для hibernate-space, скомпилировано из исходников) )
- postgis-jdbc 2.0.1 (просто попробовал это сейчас, чтобы соответствовать версии, установленной с PostgreSQL, та же проблема)
В руководстве по Hibernate Spatial 4 предлагается использовать аннотацию свойств как:
@Type(type="org.hibernate.spatial.GeometryType")
private Geometry centerPoint;
... но когда я это сделаю, я получаю эту другую ошибку, которую разрешает текущая аннотация.
@Type(type="org.hibernate.spatial.GeometryType")
аннотации плюс аннотации JPA@Column(columnDefinition = "Geometry", nullable = true)
, связанные с одним и тем же полем. - person BendaThierry.com   schedule 31.08.2012getNextException()
или вторая строка ваших журналов - это все, что вы можете получить об этом? - person BendaThierry.com   schedule 31.08.2012