16

クライアント アプリケーションから 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;

...しかし、これを行うと、現在の注釈が解決するこの他のエラーが発生します。

4

6 に答える 6

8

解決策は次のようです
@Column。JPAアノテーションを使用してフィールドを目的の列に
@Typeマップし、方言でHibernateマッピングを指定します。

@Column(columnDefinition = "Geometry", nullable = true) 
@Type(type = "org.hibernate.spatial.GeometryType")
public Point centerPoint;

hibernate.cfg.xml ファイル内に Hibernate プロパティを追加して db リクエストを確認し、「UTF-8」/「ANSI」/「その他の文字セット」を使用して Notepad++ などのテキスト ベースのエディタで文字列エンコードの問題をキャッチしようとすることができます。

<!--hibernate.cfg.xml -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>

休止状態のプロパティを追加するには、次のものを含む hibernate.cfg.xml ファイルが必要です。MySQL 指向なので、コピーして貼り付けないでください。前に呼び出したプロパティを挿入した場所を見てください。

 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 <hibernate-configuration>
      <session-factory>
           <property name="hibernate.bytecode.use_reflection_optimizer">true</property>
           <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
           <property name="hibernate.connection.password">db-password</property>
           <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db-name</property>
           <property name="hibernate.connection.username">db-username</property>
           <property name="hibernate.default_entity_mode">pojo</property>
           <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
           <property name="hibernate.format_sql">true</property>
           <property name="hibernate.search.autoregister_listeners">false</property>
           **<property name="hibernate.show_sql">true</property>**
           <property name="hibernate.use_sql_comments">false</property>

           <mapping ressource="...." />
           <!-- other hbm.xml mappings below... -->

      </session-factory>
 </hibernate-configuration>

すべての SQL をログに記録する別の方法は、log4j.properties ファイル内にパッケージ固有のプロパティを追加することです。

log4j.logger.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.type=TRACE

幸運を!

于 2012-08-31T17:42:35.783 に答える
2

http://trac.osgeo.org/postgis/ticket/1830も参照してください。Postgresql 9xx と Postgis 2xx が登場した頃に問題が発生し、postgres ユーティリティ pgsql2shp を使用すると、同じ「無効なエンディアン フラグ」エラーが発生しました。これは、Postgres が bytea のデフォルトの動作を変更したため、ライブラリ libpq.so の古いバージョンを削除することで修正できます。

于 2013-04-01T07:49:10.610 に答える
0

次の構成で動作するようになりました。Spring Boot 2.5.1、PostGIS、および hibernate-spatial 5.4.32.Final を使用しています。いくつかの重要なポイント:

  1. 私が使用する Point クラスは org.locationtech.jts.geom.Point です
  2. 特別な注釈は必要ありません。これは私のエンティティクラスです。

実在物:

@Enity public class Vehicle {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;    
    
    private Point location;
}

また、application.propertiesで、私は使用します

spring.jpa.database-platform=org.hibernate.spatial.dialect.postgis.PostgisPG95Dialect

次に、サービス クラスで、以下のように呼び出してオブジェクトをデータベースに保存できます。

public Vehicle createVehicle(String name, Double longitude, Double latitude) {
    GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326);
        var point = geometryFactory.createPoint(new Coordinate(longitude, latitude));
    
        var vehicle = new Vehicle(name, point);      
        return vehicleRepository.save(vehicle);
}
于 2021-09-02T02:07:01.763 に答える