我有一个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使用Request
字段CommsAddressType
生成String
类:
@XmlElement(name="CommsAddressType")
protected String commsAddressType
并生成架构,以便Request
表格具有CommsAddressType
类型的VARCHAR
列。这显然会导致大量不必要的重复数据。
有没有办法实现我上面描述的内容?此外,当我向客户公开xsd时,我想尽可能避免在架构中包含任何jaxb或hyperjaxb标签。
答案 0 :(得分:0)
免责声明:我是Hyperjaxb的作者。
如果您使枚举类型成为Java中的枚举,Hyperjaxb将把它们作为枚举处理,而不是作为字符串处理。为此,您可以使用以下方法自定义简单类型:
<jaxb:typesafeEnumClass/>
请参阅此example。
Hyperjaxb会将相应的属性映射为@Enumerated
。
不,您无法生成查找表,但可以自定义枚举在数据库中的映射方式。例如,您可以将其映射为EnumType.ORDINAL
:
<hj:basic><orm:enumerated>ORDINAL</orm:enumerated></hj:basic>
实际上,对于枚举,您并不需要JPA的查找表。 JPA将根据指定的EnumType
映射正确映射枚举。
但是您可能需要一个查找表用于您自己的目的 - 比如能够在连接的查询中生成人类可读的值。
在这种情况下,我建议将枚举映射为ORDINAL
,并在您自己的DDL脚本上添加查找表和相应的外键。
是的,您可以在单独的绑定文件(通常是bindings.xjb
)中执行所有描述的自定义,您不必直接在架构中执行此操作。参见测试项目here,有很多例子。只需在*.xjb
目录中查找src/main/resources
个文件。