簡體   English   中英

使用jaxb,hyperjaxb3,jpa2,jts,hibernate-spatial,當hyperjaxb將JTS Point getter標記為@Transient時,postgis失敗

[英]using jaxb, hyperjaxb3, jpa2, jts, hibernate-spatial, postgis fails when hyperjaxb marks the JTS Point getter as @Transient

我的同事哀嘆我堅持代碼生成,但我決心證明這個特定的鏈可以完成。 下面的例子從我的項目中簡化(因此未經測試的類型); 我很快就會創建一個測試工具。 目前使用的是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>

我使用bindings.xjb自定義來使用jaxb:javaType將我的xmlType wktPoint映射到JTS Point javaType,因為我想將JTS Point字段映射到postgis幾何列:

<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出現? 我似乎需要說服Hyperjaxb,我們將能夠直接將JTS Point類型寫入數據庫(這就是所有@Type的內容,表明我們希望hibernatespatial在讀取和寫入Position時使用postgis方言)。 有關如何做到這一點的任何想法?

0.5.6 hyperjaxb-ejb-plugin只是沒有正確處理綁定定制。 我構建了一個0.5.7-SNAPSHOT,它修改了org.jvnet.hyperjaxb3.ejb.strategy.mapping AttributesMapping.getAttributeMapping(),這樣我的自定義jaxb綁定就不再被標記為Transient。 我給了它以下的后備檢查:

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

這涵蓋了我的自定義,它將始終顯示為JDirectClass(Point)。 一旦我做了這個改變,postgis表就是用正確的幾何類型創建的,現在我可以接受一個WKT Point字符串,讓它作為JTS Point解組,然后用JPA作為PostGIS幾何體保存它。 還需要重建Hibernate的空間(現在用的是1.1.2-SNAPSHOT)與Hibernate4工作。 我將這項工作提交給Karel Maesen,我還將向Aleksei Valikov提交Hyperjaxb更改,希望未來的版本將更加強大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM