Hyperjaxb3:从枚举元素创建查找表

时间:2015-10-27 17:38:47

标签: hibernate xsd jaxb hyperjaxb

我有一个xsd文件,其中包含一个带枚举约束的元素:

<xs:complexType name="Request">
    <xs:sequence>
        <xs:element name="CommsAddress" type="xs:string" />
        <xs:element name="CommsAddressType">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="EMAIL"/>
                    <xs:enumeration value="PHONE"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        ...

我希望生成的Java类中的CommsAddressType字段是生成的枚举,其值为EMAILPHONE。反过来,我希望Hibernate自动生成我的数据库模式,其中CommsAddressType表包含两行,其值为EMAILPHONE。然后Request表可以使用CommsAddressTypeId列简单地引用它们。

目前,Hyperjaxb3使用Request字段CommsAddressType生成String类:

@XmlElement(name="CommsAddressType")
protected String commsAddressType

并生成架构,以便Request表格具有CommsAddressType类型的VARCHAR列。这显然会导致大量不必要的重复数据。

有没有办法实现我上面描述的内容?此外,当我向客户公开xsd时,我想尽可能避免在架构中包含任何jaxb或hyperjaxb标签。

1 个答案:

答案 0 :(得分:0)

免责声明:我是Hyperjaxb的作者。

如果您使枚举类型成为Java中的枚举,Hyperjaxb将把它们作为枚举处理,而不是作为字符串处理。为此,您可以使用以下方法自定义简单类型:

<jaxb:typesafeEnumClass/>

请参阅此example

Hyperjaxb会将相应的属性映射为@Enumerated

不,您无法生成查找表,但可以自定义枚举在数据库中的映射方式。例如,您可以将其映射为EnumType.ORDINAL

<hj:basic><orm:enumerated>ORDINAL</orm:enumerated></hj:basic>

Example

实际上,对于枚举,您并不需要JPA的查找表。 JPA将根据指定的EnumType映射正确映射枚举。

但是您可能需要一个查找表用于您自己的目的 - 比如能够在连接的查询中生成人类可读的值。

在这种情况下,我建议将枚举映射为ORDINAL,并在您自己的DDL脚本上添加查找表和相应的外键。

是的,您可以在单独的绑定文件(通常是bindings.xjb)中执行所有描述的自定义,您不必直接在架构中执行此操作。参见测试项目here,有很多例子。只需在*.xjb目录中查找src/main/resources个文件。