2015-02-10 25 views
2

在我當前的項目中,我需要處理一組包含一些財務信息的XML文件,並在稍後對該數據執行一些複雜查詢以填充數據庫模式。使用Hyperjaxb在生成的JPA模型上設置列長度

這些XML文件是基於XSD的,我使用Hyperjaxb3 maven插件從它生成JPA類,一切似乎都正常工作。不幸的是,我發現和問題是,即使在Hyperjaxb文檔,Google和這裏花費了大量的時間搜索之後,我仍然無法找到解決方案。

這是一個XML文件的片段:

<metrics> 
    <metric name="pi1" type="decimal" periodType="instant" creationDate=""> 
     <label xml:lang="es">Número de personal remunerado</label> 
     <label xml:lang="en">Number of staff recipient</label> 
    </metric> 
    <metric name="md2" type="monetary" periodType="duration" creationDate=""> 
     <label xml:lang="es">Importe devengado en el período actual (flujo)</label> 
     <label xml:lang="en">Amount awarded in the current period (flow)</label> 
    </metric> 
</metrics> 

問題是關係到標籤元素。它的XSD定義如下:

<xs:element name="label"> 
    <xs:complexType mixed="true"> 
     <xs:attribute ref="xml:lang" use="required"/> 
    </xs:complexType> 
</xs:element> 

而生成的Java類看起來是這樣的:

@XmlRootElement(name = "label") 
@Entity(name = "Label") 
@Table(name = "LABEL") 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Label implements Serializable, Equals, HashCode { 
    @XmlValue 
    protected String content; 

    ... 

    @Basic 
    @Column(name = "CONTENT") 
    public String getContent() { 
     return content; 
    } 

    @Basic 
    @Column(name = "LANG") 
    public String getLang() { 
     return lang; 
    } 
} 

我的問題是,我該怎麼定義「內容」一欄的長度是多少?目前,我一直玩我的綁定文件

<jaxb:bindings node="//xs:element[@name='label']"> 
    <hj:basic> 
     <orm:column length="1024"/> 
    </hj:basic> 
</jaxb:bindings> 

但沒有任何區別。哦,順便說一句,如果可能的話,應該避免更改XSD文件,因爲它是由第三方提供的。

+0

作者在這裏。下次直接詢問SO,我正在看標籤。您正朝着正確的方向努力,唯一的問題是 - 如何自定義混合內容屬性。我會試一試並報告。你可以通過在這裏提供樣本來幫助你:https://github.com/highsource/hyperjaxb3/tree/master/ejb/tests/cu-one/src/main/resources – lexicore 2015-02-10 12:37:41

+0

謝謝lexicore。按照建議創建PR。沒有合併它只是爲了避免任何問題(與Github一起工作的經驗不多) – 2015-02-10 13:53:01

回答

1

好的,如承諾的,這是答案。

聲明:我是作者。

考慮爲你提出的樣本XSD:

<xs:element name="ten"> 
    <xs:complexType mixed="true"> 
     <xs:attribute name="label" type="xs:string"/> 
    </xs:complexType> 
</xs:element> 

I've figured out用來定製內容屬性:

<jaxb:bindings node="xs:element[@name='ten']/xs:complexType"> 
     <hj:basic name="content"> 
      <orm:column length="1024"/> 
     </hj:basic> 
    </jaxb:bindings> 

但問題似乎是XJC應用該定製既類以及財產。該定製沒有在課堂上得到確認。並且由於XJC對此非常嚴格,因此與0.6.0一起失敗。

I've added a fix for this0.6.1,但它尚未發佈,所以你現在必須檢查和建立你自己的,直到0.6.1發佈(沒有計劃)。

ps。你可能會發現this tutorial拉請求有幫助。您在回購中做了更改,但實際上並未發送me a PR。

+0

感謝@lexicore,對於修復和教程:) – 2015-02-11 07:02:46