【问题标题】:Hyperjaxb3: Create lookup table from enumeration elementHyperjaxb3:从枚举元素创建查找表
【发布时间】:2015-10-27 17:38:47
【问题描述】:

我有一个 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 标记。

【问题讨论】:

    标签: hibernate xsd jaxb hyperjaxb


    【解决方案1】:

    免责声明:我是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,有很多例子。只需在 src/main/resources 目录中查找 *.xjb 文件即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多