クライアント アプリケーションから JTS ウェルノウン テキスト (WKT) 文字列入力を受け取り、それを JTS Geometry オブジェクトに変換してから、PostGIS データベースに書き込もうとする Spring Roo + Hibernate プロジェクトがあります。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) で保存したりできますか?
編集:また、私はすべての最新のものを使用していることにも言及する必要があります。これは、一般的に互換性があるようです:
- 春 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-spatial に推奨されます)
- postgis-jdbc 2.0.1 (PostgreSQL にインストールされているバージョンと一致するようにこれを試してみましたが、同じ問題です)
Hibernate Spatial 4 チュートリアルでは、プロパティの注釈を次のように行うことを提案しています。
@Type(type="org.hibernate.spatial.GeometryType")
private Geometry centerPoint;
...しかし、これを行うと、現在の注釈が解決するこの他のエラーが発生します。