使用 Hyperjaxb3 指定 UUID 生成的 Id 字段
Specify UUID generated Id field with Hyperjaxb3
我正在从 xsd 模式中生成 classes。
我不知道如何判断对象标识符应该是程序中生成的 UUID。我的错误是:
休眠:selectnextval ('hibernate_sequence')
org.hibernate.id.IdentifierGenerationException:此 class 的 ID 必须在调用 save() 之前手动分配:com.vsetec.collect.app.generated.Balance
我的代码是:
<xsd:complexType name="balance">
<xsd:annotation>
<xsd:documentation>Balance Amounts</xsd:documentation>
</xsd:annotation>
<xsd:all>
<xsd:element name="comment" type="longNameString"/>
</xsd:all>
<xsd:attribute name="typeCd" type="referenceCode"/>
<xsd:attribute name="amount" type="xsd:decimal"/>
<xsd:attribute name="currencyCd" type="referenceCode"/>
<xsd:attribute name="dateLoad" type="xsd:date"/>
<xsd:attribute name="historizedOn" type="historizedDate"/>
<xsd:attribute name="id" type="uuidString" minOccurs="0">
<xsd:annotation>
<xsd:appinfo>
<jaxb:property>
<jaxb:javadoc>@hyperjaxb.hibernate.id unsaved-value="null" generator-class="uuid.hex"</jaxb:javadoc>
</jaxb:property>
<hj:id>
<!--<hj:generator generatorClass="uuid"/>-->
<orm:column name="id"/>
<!--<orm:generated-value generator="uuid"/>-->
</hj:id>
</xsd:appinfo>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
更新开始
这会在我的 java 中生成以下内容:
/**
* @hyperjaxb.hibernate.id unsaved-value="null" generator-class="uuid.hex"
*
* @return
* possible object is
* {@link String }
*
*/
@Id
@Column(name = "id", length = 32)
public String getId() {
return id;
}
如果我加上
<orm:generated-value generator="uuid"/>
,它说的是 "there is no generator by the name uuid"
如果我加上
<hj:generator generatorClass="uuid"/>
,没有真正添加任何内容,没有添加 UUID 生成器或任何内容的注释。我搜索了 "uuid" 子串,所以我知道了。上面提到的错误仍然存在。
我想让 Hibernate 生成一个标识符作为 UUID。文档说它是通过如下注释实现的:
@Id
@GeneratedValue
public UUID id;
文档在这里:
描述了UUID类型的字段应该如何注解。我想这是关于如何在 Jaxb 中映射 UUID 字段的另一层问题,因此我首先尝试将其映射为十六进制字符串,例如。但是如果你有一个解决这个问题的有效解决方案,它对每个人都有用。
更新结束
之前使用 HBM 我是这样操作的:
<class entity-name="Balance">
<cache usage="read-write"/>
<comment>
Balance Amounts
</comment>
<id name="id" type="string" length="32">
<generator class="uuid"/>
</id>
<property name="currencyCd" type="string" length="32"/>
<property name="amount" type="big_decimal"/>
<property name="comment" type="string" length="255"/>
<property name="historizedOn" type="date"/>
</class>
upd
我不知道这个 xml 映射对应的注释是什么,但它起作用了。似乎它将 UUID 生成器附加到 String 字段。我不能说 class 定义是什么,因为我使用了 "dynamic-maps"。我的任务只是从 HBM 和动态 maps 切换到 Hyperjaxb 并生成 classes.
回答
(以答案的形式而不是模糊的 rtfm 风格提示)
<xsd:attribute name="id" type="uuidString" minOccurs="0">
<xsd:annotation>
<xsd:appinfo>
<hj:id>
<orm:column name="id"/>
<orm:generated-value generator="uuid"/>
</hj:id>
<annox:annotate>
<ha:GenericGenerator name="uuid" strategy="uuid2"/>
</annox:annotate>
</xsd:appinfo>
</xsd:annotation>
</xsd:attribute>
uuidString 的长度应为 36 个字符
ps。大量插入仍然存在问题(怀疑 uuid dupes,但尚未确定
您可以通过如下自定义生成 @GeneratedValue
:
<hj:id>
<orm:generated-value strategy="..." generator="..."/>
</hj:id>
你已经用 generator="uuid"
试过了,得到了类似 "generator uuid is not known" 的结果。这可能是因为您还需要实际为名称 uuid
配置一个生成器,就像在 Hibernate 文档中一样:
@GenericGenerator(
name = "uuid",
strategy = "org.hibernate.id.UUIDGenerator",
parameters = {
@Parameter(
name = "uuid_gen_strategy_class",
value = "org.hibernate.id.uuid.CustomVersionOneStrategy"
)
}
)
但是,这不是标准的 JPA 注释,因此 HJ3 不会生成它。您可以使用 jaxb2-annotate-plugin 添加此注释。
免责声明:我是 Hyperjaxb3 和 jaxb2-annotate-plugin.
的作者
我正在从 xsd 模式中生成 classes。
我不知道如何判断对象标识符应该是程序中生成的 UUID。我的错误是:
休眠:selectnextval ('hibernate_sequence') org.hibernate.id.IdentifierGenerationException:此 class 的 ID 必须在调用 save() 之前手动分配:com.vsetec.collect.app.generated.Balance
我的代码是:
<xsd:complexType name="balance">
<xsd:annotation>
<xsd:documentation>Balance Amounts</xsd:documentation>
</xsd:annotation>
<xsd:all>
<xsd:element name="comment" type="longNameString"/>
</xsd:all>
<xsd:attribute name="typeCd" type="referenceCode"/>
<xsd:attribute name="amount" type="xsd:decimal"/>
<xsd:attribute name="currencyCd" type="referenceCode"/>
<xsd:attribute name="dateLoad" type="xsd:date"/>
<xsd:attribute name="historizedOn" type="historizedDate"/>
<xsd:attribute name="id" type="uuidString" minOccurs="0">
<xsd:annotation>
<xsd:appinfo>
<jaxb:property>
<jaxb:javadoc>@hyperjaxb.hibernate.id unsaved-value="null" generator-class="uuid.hex"</jaxb:javadoc>
</jaxb:property>
<hj:id>
<!--<hj:generator generatorClass="uuid"/>-->
<orm:column name="id"/>
<!--<orm:generated-value generator="uuid"/>-->
</hj:id>
</xsd:appinfo>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
更新开始 这会在我的 java 中生成以下内容:
/**
* @hyperjaxb.hibernate.id unsaved-value="null" generator-class="uuid.hex"
*
* @return
* possible object is
* {@link String }
*
*/
@Id
@Column(name = "id", length = 32)
public String getId() {
return id;
}
如果我加上
<orm:generated-value generator="uuid"/>
,它说的是 "there is no generator by the name uuid"
如果我加上
<hj:generator generatorClass="uuid"/>
,没有真正添加任何内容,没有添加 UUID 生成器或任何内容的注释。我搜索了 "uuid" 子串,所以我知道了。上面提到的错误仍然存在。
我想让 Hibernate 生成一个标识符作为 UUID。文档说它是通过如下注释实现的:
@Id
@GeneratedValue
public UUID id;
文档在这里:
描述了UUID类型的字段应该如何注解。我想这是关于如何在 Jaxb 中映射 UUID 字段的另一层问题,因此我首先尝试将其映射为十六进制字符串,例如。但是如果你有一个解决这个问题的有效解决方案,它对每个人都有用。
更新结束
之前使用 HBM 我是这样操作的:
<class entity-name="Balance">
<cache usage="read-write"/>
<comment>
Balance Amounts
</comment>
<id name="id" type="string" length="32">
<generator class="uuid"/>
</id>
<property name="currencyCd" type="string" length="32"/>
<property name="amount" type="big_decimal"/>
<property name="comment" type="string" length="255"/>
<property name="historizedOn" type="date"/>
</class>
upd
我不知道这个 xml 映射对应的注释是什么,但它起作用了。似乎它将 UUID 生成器附加到 String 字段。我不能说 class 定义是什么,因为我使用了 "dynamic-maps"。我的任务只是从 HBM 和动态 maps 切换到 Hyperjaxb 并生成 classes.
回答 (以答案的形式而不是模糊的 rtfm 风格提示)
<xsd:attribute name="id" type="uuidString" minOccurs="0">
<xsd:annotation>
<xsd:appinfo>
<hj:id>
<orm:column name="id"/>
<orm:generated-value generator="uuid"/>
</hj:id>
<annox:annotate>
<ha:GenericGenerator name="uuid" strategy="uuid2"/>
</annox:annotate>
</xsd:appinfo>
</xsd:annotation>
</xsd:attribute>
uuidString 的长度应为 36 个字符
ps。大量插入仍然存在问题(怀疑 uuid dupes,但尚未确定
您可以通过如下自定义生成 @GeneratedValue
:
<hj:id>
<orm:generated-value strategy="..." generator="..."/>
</hj:id>
你已经用 generator="uuid"
试过了,得到了类似 "generator uuid is not known" 的结果。这可能是因为您还需要实际为名称 uuid
配置一个生成器,就像在 Hibernate 文档中一样:
@GenericGenerator(
name = "uuid",
strategy = "org.hibernate.id.UUIDGenerator",
parameters = {
@Parameter(
name = "uuid_gen_strategy_class",
value = "org.hibernate.id.uuid.CustomVersionOneStrategy"
)
}
)
但是,这不是标准的 JPA 注释,因此 HJ3 不会生成它。您可以使用 jaxb2-annotate-plugin 添加此注释。
免责声明:我是 Hyperjaxb3 和 jaxb2-annotate-plugin.
的作者