Hyperjaxb3:从枚举元素创建查找 table
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 class 中的 CommsAddressType
字段是一个生成的枚举,其值为 EMAIL
和 PHONE
。反过来,我希望 Hibernate 自动生成我的数据库模式,其中 CommsAddressType
table 包含两行,值为 EMAIL
和 PHONE
。然后 Request
table 可以简单地用 CommsAddressTypeId
列引用它们。
目前,Hyperjaxb3 生成我的 Request
class,其中 CommsAddressType
字段类型为 String
:
@XmlElement(name="CommsAddressType")
protected String commsAddressType
并生成架构,以便 Request
table 具有类型 VARCHAR
的 CommsAddressType
列。这显然会导致很多不必要的重复数据。
有什么方法可以实现我上面描述的吗?此外,由于我将 xsd 公开给我的客户,因此我希望尽可能避免在架构中包含任何 jaxb 或 hyperjaxb 标记。
免责声明:我是Hyperjaxb的作者。
如果您使枚举类型成为 Java 中的枚举,Hyperjaxb 会将它们作为枚举而不是字符串来处理。例如,您可以为此自定义您的简单类型:
<jaxb:typesafeEnumClass/>
看到这个 example。
Hyperjaxb 会将相应的属性映射为 @Enumerated
。
不,您不能生成查找 table 但您可以自定义枚举在数据库中的映射方式。例如,您可以将其映射为 EnumType.ORDINAL
:
<hj:basic><orm:enumerated>ORDINAL</orm:enumerated></hj:basic>
实际上,对于枚举,您实际上不需要为 JPA 查找 table。 JPA 将根据指定的 EnumType
映射正确映射枚举。
但您可能需要查找 table 用于您自己的目的 - 例如能够在连接查询中生成人类可读的值。
在这种情况下,我建议将枚举映射为 ORDINAL
并在您自己的 DDL 脚本中添加查找 table 和相应的外键。
是的,您可以在单独的绑定文件(通常是 bindings.xjb
)中执行所有描述的自定义设置,而不必直接在架构中执行。查看测试项目 here,有很多例子。只需在 src/main/resources
个目录中查找 *.xjb
个文件。
我有一个 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 class 中的 CommsAddressType
字段是一个生成的枚举,其值为 EMAIL
和 PHONE
。反过来,我希望 Hibernate 自动生成我的数据库模式,其中 CommsAddressType
table 包含两行,值为 EMAIL
和 PHONE
。然后 Request
table 可以简单地用 CommsAddressTypeId
列引用它们。
目前,Hyperjaxb3 生成我的 Request
class,其中 CommsAddressType
字段类型为 String
:
@XmlElement(name="CommsAddressType")
protected String commsAddressType
并生成架构,以便 Request
table 具有类型 VARCHAR
的 CommsAddressType
列。这显然会导致很多不必要的重复数据。
有什么方法可以实现我上面描述的吗?此外,由于我将 xsd 公开给我的客户,因此我希望尽可能避免在架构中包含任何 jaxb 或 hyperjaxb 标记。
免责声明:我是Hyperjaxb的作者。
如果您使枚举类型成为 Java 中的枚举,Hyperjaxb 会将它们作为枚举而不是字符串来处理。例如,您可以为此自定义您的简单类型:
<jaxb:typesafeEnumClass/>
看到这个 example。
Hyperjaxb 会将相应的属性映射为 @Enumerated
。
不,您不能生成查找 table 但您可以自定义枚举在数据库中的映射方式。例如,您可以将其映射为 EnumType.ORDINAL
:
<hj:basic><orm:enumerated>ORDINAL</orm:enumerated></hj:basic>
实际上,对于枚举,您实际上不需要为 JPA 查找 table。 JPA 将根据指定的 EnumType
映射正确映射枚举。
但您可能需要查找 table 用于您自己的目的 - 例如能够在连接查询中生成人类可读的值。
在这种情况下,我建议将枚举映射为 ORDINAL
并在您自己的 DDL 脚本中添加查找 table 和相应的外键。
是的,您可以在单独的绑定文件(通常是 bindings.xjb
)中执行所有描述的自定义设置,而不必直接在架构中执行。查看测试项目 here,有很多例子。只需在 src/main/resources
个目录中查找 *.xjb
个文件。