xsd スキーマからクラスを生成しています。
オブジェクト識別子がプログラムで生成された UUID であることを伝える方法がわかりません。私のエラーは次のとおりです。
Hibernate: select nextval ('hibernate_sequence') org.hibernate.id.IdentifierGenerationException: save() を呼び出す前に、このクラスの ID を手動で割り当てる必要があります: 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>
upd start これにより、私の 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"/>
、「uuidという名前のジェネレーターはありません」のようなものがあります
追加すると
<hj:generator generatorClass="uuid"/>
、実際には何も追加されず、UUIDジェネレーターなどを追加するための注釈はありません。「uuid」部分文字列を検索したので、わかりました。上記のエラーが残ります。
Hibernate で識別子を UUID として生成するようにしたいと考えています。ドキュメントは、次のような注釈で達成されると言います:
@Id
@GeneratedValue
public UUID id;
ドキュメントは次のとおりです。
UUID タイプのフィールドに注釈を付ける方法について説明します。Jaxb で UUID フィールドをマップする方法に関する別の質問層だと思うので、たとえば、最初に 16 進文字列としてマップしようとします。しかし、この問題に対する実用的な解決策があれば、それは誰にとっても役に立ちます。
アップエンド
以前は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>
更新
この xml マッピングが対応する注釈はわかりませんが、うまくいきました。UUID ジェネレーターを String フィールドにアタッチしているようです。「動的マップ」を使用したため、クラス定義が何であったかはわかりません。私の仕事は、HBM と動的マップから Hyperjaxb と生成されたクラスに切り替えることだけです。
ANSWER (あいまいな 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 の重複が疑われますが、まだわかりません