2015-02-10 63 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