1

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;

ドキュメントは次のとおりです。

http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators-uuid

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 の重複が疑われますが、まだわかりません

4

1 に答える 1

0

@GeneratedValue次のようなカスタマイズで生成できます。

<hj:id>
    <orm:generated-value strategy="..." generator="..."/>
</hj:id>

これを試してみたところ、generator="uuid"「generator uuid is not unknown」のようなものが得られました。uuidこれはおそらく、 Hibernate docs のように、 name のジェネレーターを実際に構成する必要があるためです。

@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の作成者です。

于 2016-05-22T22:53:18.173 に答える