2016-05-20 1 views
1

Я генерирую классы из xsd-схем.Укажите поле идентификатора UUID с Hyperjaxb3

Я не могу понять, как сказать, что идентификатор объекта должен быть UUID, сгенерированным в программе. Моя ошибка:

Hibernate: выберите NEXTVAL ('hibernate_sequence') org.hibernate.id.IdentifierGenerationException: Идентификаторы для этого класса должны быть назначены вручную перед вызовом сохранения(): com.vsetec.collect.app.generated. Баланс

Мой код:

<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"/> 

, он говорит что-то вроде «нет генератора по имени 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. Я предполагаю, что это еще один вопрос о том, как отображать поля UUID в Jaxb, поэтому я бы сначала попытался отобразить его как шестнадцатеричную строку. Но если у вас есть рабочее решение для этой проблемы, которое далеко не редко, это было бы полезно для всех.

конца обн

Ранее с 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. Я не могу сказать, что такое определение класса, потому что я использовал «динамические карты». Моя задача - просто переключиться с HBM и динамических карт на Hyperjaxb и сгенерированные классы.

ОТВЕТ (в форме ответа, а что смутный 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 символов длиной

пса. есть еще проблема с массовыми вставками (подозреваемый UUID обманутых, но не уверена, что

+0

Этот вопрос сводится к следующему: какие аннотации генерирует HJ3 и что вы хотели бы сгенерировать? – lexicore

+0

@lexicore спасибо, я обновил вопрос. В принципе, я не знаю, какие аннотации Hibernate/Persistence должны быть сгенерированы ... Моя единственная надежда заключалась в том, что проблема довольно распространена, и у нее должно быть простое решение. – fedd

ответ

0

Вы можете создавать @GeneratedValue с настройкой, как: генератор

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

Вы пробовали это с generator="uuid" и получили что-то вроде» UUID не известно»Это, вероятно, потому, что вы также должны фактически настроить генератор для имени uuid, как в Hibernate Документах.

@GenericGenerator(
    name = "uuid", 
    strategy = "org.hibernate.id.UUIDGenerator", 
    parameters = { 
     @Parameter(
      name = "uuid_gen_strategy_class", 
      value = "org.hibernate.id.uuid.CustomVersionOneStrategy" 
     ) 
    } 
) 

Это, однако, не стандартный J PA, поэтому HJ3 не генерирует его. Вы можете использовать jaxb2-annotate-plugin, чтобы добавить эту аннотацию.

Отказ от ответственности: Я являюсь автором Hyperjaxb3 и jaxb2-annotate-plugin.

+0

Спасибо! Как именно мне нужно использовать jaxb2-annotate-plugin? Если мне не нужны параметры, просто имя и стратегия (надеюсь, что это сработает) – fedd

+0

@fedd Я думаю, что [README] (https://github.com/highsource/jaxb2-annotate-plugin) вполне объяснимо , Или задайте другой вопрос. Короче говоря, 'annox: annotate' с вашей аннотацией (классы должны быть полностью квалифицированными), прикрепленными к соответствующему свойству. См. [Этот пример] (https://github.com/highsource/hyperjaxb3/tree/master/ejb/tests/annox) для использования HJ3. – lexicore

 Смежные вопросы

  • Нет связанных вопросов^_^