2015-07-20 71 views
1

我试图用hyperjaxb3创建从三米的.xsd(C14054.xsd,C14054CodeLists.xsd & C14054DataTypes.xsd)available here关系模式,然后从XML <元帅数据 - > Java的< - >关系。hyperjaxb3:枚举问题

hyperjaxb3在创建关系模式方面已经比我评估过的非常昂贵的商业工具做得更好 - 但我无法完全按照自己想要的方式去做Enum。

例如在C14054.xsd中, '提供者' 的元素引用 'RECID'

<xs:element name="Provider"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element ref="RECID" minOccurs="1" maxOccurs="1" /> 

这又是类型为 'RECIDCodeType'

<xs:element name="RECID" type="RECIDCodeType" /> 

从C14054CodeLists.xsd

<xs:complexType name="RECIDCodeType"> 
<xs:simpleContent> 
    <xs:extension base="RECIDCodeContentType" /> 
</xs:simpleContent> 

它扩展了RECIDCodeContentType

<xs:simpleType name="RECIDCodeContentType"> 
<xs:restriction base="xs:string"> 
    <xs:enumeration value="14054"> 
    <xs:annotation> 
     <xs:documentation> 
     <Label>2014/15 AP student record</Label> 
     </xs:documentation> 
    </xs:annotation> 
    </xs:enumeration> 
</xs:restriction> 

  1. 枚举类型在数据库中作为“查找表”与列“HJID”和“VALUE_”创建的。表的主键可能是VALUE_,而不是自动编号的HJID?

I.e.可以唯一有效的入口(在数据库层)到Provider.RECID(我改变了bindings.xjb中的列名)是'14054'?

  1. 当模式创建时,Enum值是否可以保存到关系表中?

I.e.可以将14054作为一行添加到数据库中的Subpurposecodetype.VALUE_列中?

非常感谢任何人可以摆脱任何光!

+0

我现在没有时间做完整的答案,但这里有提示。 (1)你基本上想使用这个值作为id。这应该可以用'hj:id'自定义。必须放置在值属性 - 我认为附加到'xs:simpleContent'。 (2)初始化数据库不在范围内。你必须自己定制DDL脚本。 – lexicore

+0

lexicore - 你是真正的男人之王! – pieman

+0

1)我以为我曾试过的每一个可能的位置,可能工作 - 但显然不是! 你的保证,这是可能的,我需要有另一个裂缝,并得到它!我将在下面发布完整答案。 2)不用担心。我们还提供了枚举/查找值的.csv文件,因此填充生成的模式并不是什么大不了的事情。 但是,如果你想将它添加到未来版本的hyperjaxb ...;) 非常感谢! hyperjaxb将为我们节省很多时间。该项目是否接受捐赠? – pieman

回答

0

希望这将帮助一些人在未来(感谢lexicore指着我在正确的方向!):

嵌入式解决方案:

<xs:simpleType name="RECIDCodeContentType"> 
<xs:annotation> 
    <xs:appinfo> 
     <hj:id /> 
    </xs:appinfo> 
</xs:annotation> 
<xs:restriction base="xs:string"> 
    <xs:enumeration value="14054"> 
    <xs:annotation> 
     <xs:documentation> 
     <Label>2014/15 AP student record</Label> 
     </xs:documentation> 
    </xs:annotation> 
    </xs:enumeration> 
</xs:restriction> 

外部绑定文件解决方案, :

<jaxb:bindings schemaLocation="C14054CodeLists.xsd" node="/xs:schema"> 
    <!-- RECIDCodeType : Make VALUE Primary Key --> 
    <jaxb:bindings node="xs:simpleType[@name='RECIDCodeContentType']"> 
     <hj:id /> 
    </jaxb:bindings> 
</jaxb:bindings> 

结果:

@Id 
@Column(name = "VALUE_") 
public String getValue() { 
    return value; 
}