私の同僚は、私がコード生成に固執していることを嘆いていますが、私はこの特定のチェーンが実行可能であることを証明することを決意しています. 以下の例は、私のプロジェクトから簡略化したものです (したがって、入力したとおりにテストされていません)。すぐにテストハーネスを作成します。現在、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 方言を使用してもらいたいことを示しています)。それを行う方法についてのアイデアはありますか?