[英]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
字段是带有值EMAIL
和PHONE
的生成的枚举。 反过来,我希望Hibernate使用CommsAddressType
表自动生成数据库模式,该表包含两行,值EMAIL
和PHONE
。 然后, Request
表可以使用CommsAddressTypeId
列简单地引用它们。
目前,Hyperjaxb3使用类型为String
的CommsAddressType
字段生成我的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.