0

私の同僚は、私がコード生成に固執していることを嘆いていますが、私はこの特定のチェーンが実行可能であることを証明することを決意しています. 以下の例は、私のプロジェクトから簡略化したものです (したがって、入力したとおりにテストされていません)。すぐにテストハーネスを作成します。現在、hibernate 4.1.4、hibernate-spatial 1.1.1、hyperjaxb3-ejb-plugin 0.5.6 を使用しています。

型が単純な文字列拡張である Position 要素を使用するスキーマから始めます。

  <xsd:simpleType name="wktPoint">
    <xsd:restriction base="xsd:string">
    </xsd:restriction>
  </xsd:simpleType>

JTS Point フィールドを postgis ジオメトリ列にマップしたいので、bindings.xjb カスタマイズを使用して、jaxb:javaType を使用して xmlType wktPoint を JTS Point javaType にマップします。

<jaxb:javaType name="com.vividsolutions.jts.geom.Point" xmlType="wktPoint" parseMethod="test.Reader.readWKTPoint" printMethod="test.Writer.writeWKTPoint" />

bindings.xjb の後半で、annox:annotation を使用して Position 要素のカスタマイズを開始します。

<jaxb:bindings node="xsd:complexType[@name='MyType']//xsd:element[@name='Position']">
  <annox:annotate target="getter">
    <annox:annotate annox:class="javax.persistence.Basic"/>        
    <annox:annotate annox:class="javax.persistence.Column" name="POSITION" columnDefinition="GEOMETRY"/>
    <annox:annotate annox:class="org.hibernate.annotations.Type" type="org.hibernatespatial.GeometryUserType">
      <annox:annotate annox:field="parameters">
        <annox:annotate annox:class="org.hibernate.annotations.Parameter" name="dialect" value="postgis"/>
      </annox:annotate>
    </annox:annotate>
  </annox:annotate>      
</jaxb:bindings>

ただし、これにより MyType.java に次の getPosition メソッドが生成されます。

/**
 * Gets the value of the position property.
 * @return
 *     possible object is
 *     {@link String }
 */
@Transient
@Basic
@Column(columnDefinition = "GEOMETRY", name = "POSITION")
@Type(parameters = {
    @Parameter(name = "dialect", value = "postgis")
}, type = "org.hibernatespatial.GeometryUserType")
public Point getPosition() {
    return position;
}

したがって、アプリケーションを起動し、jpa/hibernate がテーブルの初期化を開始すると、POSITION 列が完全にスキップされます (@Transient とマークされているため)。

@Transient が表示されないようにするにはどうすればよいですか? JTS Point タイプをデータベースに直接書き込むことができるようになることを Hyperjaxb に納得させる必要があるようです (それがすべての @Type に関するものであり、位置の読み取りと書き込み時に hibernatespatial に postgis 方言を使用してもらいたいことを示しています)。それを行う方法についてのアイデアはありますか?

4

1 に答える 1

2

0.5.6 hyperjaxb-ejb-pluginは、バインディングのカスタマイズを適切に処理しません。org.jvnet.hyperjaxb3.ejb.strategy.mappingAttributesMapping.getAttributeMapping()を変更した0.5.7-SNAPSHOTを作成して、カスタマイズしたjaxbバインディングにTransientというラベルが付けられないようにしました。次のフォールバックチェックを行いました。

if (isFieldOutlineBasic(fieldOutline)) {
    ...
} else if (isFieldOutlineComplex(fieldOutline)) {
    ...
} else {
    if (fieldOutline.getRawType() instanceof JClass) {
        return context.getBasicMapping();
    }
}

これは私のカスタマイズをカバーし、常にJDirectClass(Point)として表示されます。その変更を行うと、postgisテーブルは正しいジオメトリタイプで作成され、WKTポイント文字列を取り込んでJTSポイントとしてアンマーシャルし、JPAでPostGISジオメトリとして永続化できるようになりました。また、Hibernate4を使用するに、Hibernate Spatial(現在は1.1.2-SNAPSHOTを使用)を再構築する必要がありました。この作品をKarelMaesenに提出し、Hyperjaxbの変更をAleksei Valikovに提出します。将来のバージョンが、はるかに堅牢になることを願っています。

于 2012-06-03T06:19:00.287 に答える