繁体   English   中英

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

[英]Hyperjaxb3: Create lookup table from enumeration element

我有一个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使用类型为StringCommsAddressType字段生成我的Request类:

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

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

有什么方法可以实现我上面描述的内容? 另外,当我向客户展示xsd时,如果可能的话,我希望避免在模式中包括任何jaxb或hyperjaxb标记。

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

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

<jaxb:typesafeEnumClass/>

请参阅此示例

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

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

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

例子

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

但是您可能需要一个用于您自己目的的查找表-例如能够在联接的查询中产生易于理解的值。

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

是的,您可以在单独的绑定文件(通常为bindings.xjb )中进行所有描述的自定义操作,而不必在架构中直接进行。 在此处查看测试项目, 这里有很多示例。 只需在src/main/resources目录中查找*.xjb文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM