1

MySQLデータベース(v5.5.28)のエントリに、地理空間情報(具体的には「ポイント」)を追加する必要があります。簡単なコードを使用して、作成した列「location」をJavaEJBエンティティServiceInfoの対応するプロパティにマップしようとしました。

@Column(name = "location")
private com.vividsolutions.jts.geom.Point location;

ただし、これにより次のエラーが発生します。

Exception [EclipseLink-66] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Could not deserialize object from byte array.
Internal Exception: java.io.StreamCorruptedException: invalid stream header: 00000000
Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping[location-->ServiceInfo.location]
Descriptor: RelationalDescriptor(ies.persistence.entity.ServiceInfo --> [DatabaseTable(ServiceInfo)])
at org.eclipse.persistence.exceptions.DescriptorException.notDeserializable(DescriptorException.java:1218)
at org.eclipse.persistence.mappings.converters.SerializedObjectConverter.convertDataValueToObjectValue(SerializedObjectConverter.java:72)
...

問題は、java mysqlコネクタ(v5.1.22)が地理空間情報をサポートしていないことだと思います。これは、データベースがサポートしているので私を驚かせます。誰かがこれが事実であることを確認できますか、または私が間違っている可能性があることを教えて、正しい方向に私を向けることができますか?

私はNetbeans7.2で作業しており、JDK1.7とGlassFishServer3.1.2を使用しています。

4

1 に答える 1

-1

わかりましたので、永続層に次の変更を加えることで、最終的に問題を修正しました。

空間拡張 PostGIS を使用して、MySQL データベースから PostgeSQL データベースに切り替えました。これは、MySQL が OpenGIS 仕様を部分的にしか実装していないためです。次に、EclipseLink (JPA 2.0)(デフォルト) の永続化ユニットを Hibernate (JPA 2.0) に変更する必要がありました。

私のプロジェクトとglassfishの両方のクラスパスに含めるJar(他の方法では見つけることができないようでした.domain1のルートにコピーする必要がありました)は次のとおりです。

  • postgresql-9.2-1002.jdbc4.jar
  • postgis-jdbc-2.1.0SVN.jar
  • Hibernate 4.1.8 (必要なすべての jar、オプションの ehcache、および JPA の hibernate-entitymanager-4.1.8.Final.jar ... これらはすべてリリース バンドルに含まれています)
  • hibernate-spatial-4.0-M1.jar (hibernate-spatial-1.1.1.jar と hibernate-spatial-postgis-1.1.1.jar は Hibernate 4.x と互換性がありません!)。
  • jts-1.8.jar

結果の persistence.xml ファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="IES-ejbPU" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/postgresql_iesdb3</jta-data-source>
    <class>ies.persistence.entity.ServiceInfo</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
      <property name="hibernate.dialect" value="org.hibernate.spatial.dialect.postgis.PostgisDialect"/>
      <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
  </persistence-unit>
</persistence>

私の EJB エンティティに使用するアノテーションは次のとおりです。

@Type(type="org.hibernate.spatial.GeometryType") 
@Column(name = "location", columnDefinition="Geometry")
private com.vividsolutions.jts.geom.Geometry location;

これで、Hibernate + JPA + PostgeSQL/PostGIS を使用した適切なマッピングができました。

于 2012-11-28T11:27:30.620 に答える